ちなみに、これがその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