正直これが正しいのか良く分かっていない。
(import (text sxml ssax) (text sxml sxpath) (pp))
(define *xml* "<?xml version=\"1.0\" ?><root xmlns:h=\"http://localhost/\"><h:p>hello</h:p></root>")
(define *namespace* '((h . "http://localhost/")))
(let ((sxml (ssax:xml->sxml (open-string-input-port *xml*) *namespace*))
(sxml2 (ssax:xml->sxml (open-string-input-port *xml*) '())))
(pp sxml)
(pp sxml2)
(let ((doc ((sxpath '(root h:p)) sxml))
(doc2 ((sxpath '(root h:p) *namespace*) sxml2)))
(pp doc)
(pp doc2)))
#|
(*TOP* (@ (*NAMESPACES* (h "http://localhost/")))
(*PI* xml "version=\"1.0\" ")
(root (h:p "hello")))
(*TOP* (*PI* xml "version=\"1.0\" ")
(root (http://localhost/:p "hello")))
((h:p "hello"))
()
|#
パース時に名前空間を与えてやるとタグをプレフィックス付でパースする。与えないとそのまま長い名前で出力する。プレフィックス付のSXMLをsxpathに渡すなら、名前空間は要らない(あってもよい)。
プレフィックスなしをsxpathに渡すなら長い名前で指定する必要がある。名前空間渡しても識別しない。
ここに使い方があった。
Re: SXPath namespaces - msg#00006
どうやらsxpathの第二引数は微妙な動作をするくさい。上記の例だと
(pp ((sxpath "//root/h:p" *namespace*) sxml2)) #| ((http://localhost/:p "hello")) |#これで通る。S式なクエリでは認識しないが文字列ならOK。いまいちssaxとの相性が悪いというか、完全別モジュールという感じだ。
No comments:
Post a Comment