ちなみに、これがその1
以下のコードを実行する。(sample.xsdはXSDで記述されたXMLファイルである)
(import (rnrs) (text sxml ssax) (text sxml sxpath) (sagittarius control) (pp)) (define-constant namespace '((xsd . "http://www.w3.org/2001/XMLSchema"))) (call-with-input-file "sample.xsd" (^p (and-let* ((sxml (ssax:xml->sxml p namespace)) (path (sxpath "//xsd:schema" namespace)) (doc (path sxml))) (pp sxml) (pp doc)))) #| Output: (*TOP* (@ (*NAMESPACES* (xsd "http://www.w3.org/2001/XMLSchema"))) (*PI* xml "version=\"1.0\" encoding=\"ISO-8859-1\" ") (xsd:schema (xsd:element (@ (name "shiporder")) (xsd:complexType (xsd:sequence (xsd:element (@ (type "xs:string") (name "orderperson"))) (xsd:element (@ (name "shipto")) (xsd:complexType (xsd:sequence (xsd:element (@ (type "xs:string") (name "name"))) (xsd:element (@ (type "xs:string") (name "address"))) (xsd:element (@ (type "xs:string") (name "city"))) (xsd:element (@ (type "xs:string") (name "country")))))) (xsd:element (@ (name "item") (maxOccurs "unbounded")) (xsd:complexType (xsd:sequence (xsd:element (@ (type "xs:string") (name "title"))) (xsd:element (@ (type "xs:string") (name "note") (minOccurs "0"))) (xsd:element (@ (type "xs:positiveInteger") (name "quantity"))) (xsd:element (@ (type "xs:decimal") (name "price"))))))) (xsd:attribute (@ (use "required") (type "xs:string") (name "orderid"))))))) () |#sxpathに名前空間を渡しているのに、何も返してこない。これに昨日30分くらいはまった。これは指定している名前空間がまずくて、正しくは以下のものを渡さないといけない。
'((xsd . "xsd"))sxpathに渡される名前空間は、ssaxのそれとは違い、「XPath内にある名前空間の解決」に使われる。つまり、上記のコードで言えば、"//xsd:schema"の部分の"xsd:"である。この部分が、「渡された名前空間のcar部」で、「cdr部は操作するSXMLのエレメントの名前空間」になる。
なので、渡されたSXMLがフルネーム(ここではURIを指す)で修飾されていれば、上記のコードのような名前空間を渡しても問題ない。
この仕様のいいところは、名前空間さえ正しく指定してやればXPathを変更せずに異なる名前空間プリフィックスが処理できること。たとえば、上記のSXMLのプリフィックスがxsとかでも、'((xsd . "xs"))を渡してやれば、XPathの修正は要らない。
嫌なところは、ssaxに名前空間を渡してでパースされたSXMLと非常に相性が悪いこと。
これは、挙動からの推測だが、この名前空間の解決はXPathでのみ発生していて、SXPathでは起きないみたい。なので、"//xsd:schema"の部分を'(// xsd:schema)とすると名前空間なしでも値が返ってくる。この奇妙なチグハグ感もなかなか「トリッキーなライブラリを使ってるぜ!」的な陶酔感をかもし出していていい感じではある。(正直勘弁してほしいが・・・)
その1のページで言及されているメールのリプライに答えというかsxpathにおける名前空間の扱いが書いてあるので、単に蛇足ではあるが。
No comments:
Post a Comment