Thread: [ssax-sxml] Bug in ssax:xml->sxml
Brought to you by:
oleg
From: Lindsay S. <li...@co...> - 2005-06-20 05:31:01
|
I am trying to define my own namespace definitions before parsing an xml fragment. It does not work. Example: #;> (define testxml "<foo><testns:tag>bar</testns:tag></foo>") #;> (call-with-input-string testxml (lambda (port) (ssax:xml->sxml port '((testns . "replaced"))))) Error: [nsc-NSDeclared] broken; prefix Possible solution: inside ssax:xml->sxml : (namespaces (map (lambda (el) (cons* #f (car el) (ssax:uri-string->symbol (cdr el)))) namespace-prefix-assig)) This appears to incorrectly set up the namespace list for the user-supplied namespaces. The #f on the front makes the assq call in ssax:resolve-name fail. If I change it to: (namespaces (map (lambda (el) (cons* (car el) (ssax:uri-string->symbol (cdr el)) #f)) namespace-prefix-assig)) Then I get: #;> (call-with-input-string testxml (lambda (port) (ssax:xml->sxml port '((testns . "replaced"))))) (*top* (|@@| (*namespaces* (testns "replaced"))) (foo (replaced:tag "bar"))) which is the desired result. I don't really know if the #f belongs on the end of the association list, but I know from reading resolve-name that the cadr must be the thing to replace it with. This has also been filed as a bug on sourceforge. Lindsay |
From: <ol...@po...> - 2005-06-20 21:01:33
|
Hello! > I am trying to define my own namespace definitions before parsing an xml > fragment. It does not work. There is no bug in the SSAX code, but there is a matter of misunderstanding. <foo><testns:tag>bar</testns:tag></foo> That is not well-formed XML (if we take XML Namespace Recommendation into account): the namespace `testns' is not defined. So, SSAX correctly reports the error, *as it must* according to that Recommendation. The well-formed document would look like <foo xmlns:testns="http://my/long/URI"><testns:tag>bar</testns:tag></foo> When you parse it, you'd get (*TOP* (foo (http://my/long/URI:tag "bar"))) obviously, tag `http://my/long/URI:tag' is a bit too unwieldy to carry around. That's where user-defined prefixes come in: gosh> (call-with-input-string testxml (lambda (port) (ssax:xml->sxml port '((t . "http://my/long/URI"))))) (*TOP* (|@@| (*NAMESPACES* (t "http://my/long/URI"))) (foo (t:tag "bar"))) So, you define the abbreviation 't' that stands for http://my/long/URI as the namespace URI. The prefix `testns' doesn't occur anywhere -- as it actually shouldn't by the intention of XML Namespace Recommendation. The prefix `testns' can still be preserved in the output of the parser (as some XML activities are alas contrary to the spirit of XML Namespace Recommendation). The Section http://pobox.com/~oleg/ftp/Scheme/SXML.html#Namespaces discusses this subject of XML Namespaces and prefixes in more detail. Cheers, Oleg |