web-dev-qa-db-ja.com

XQuery / XPathを使用して要素の親ノードの属性値を取得する

このxmlドキュメントを考えると:

<?xml version="1.0" encoding="UTF-8"?>
    <mydoc>
        <foo f="fooattr">
            <bar r="barattr1">
                <baz z="bazattr1">this is the first baz</baz>
            </bar>
            <bar r="barattr2">
                <baz z="bazattr2">this is the second baz</baz>
            </bar>
        </foo>
    </mydoc>

それはこのxqueryによって処理されています:

let $d := doc('file:///Users/mark/foo.xml')
let $barnode := $d/mydoc/foo/bar/baz[contains(@z, '2')]
let $foonode := $barnode/../../@f
return $foonode

次のエラーが発生します。

"Cannot create an attribute node (f) whose parent is a document node". 

../操作は、ドキュメントノードであると見なすように、ドキュメントの残りの部分から一致するノードを削除するようなもののようです。

私は他のアプローチを受け入れていますが、親の選択は特定の部分文字列を含む子属性に依存します。

乾杯!

20
Mark Stewart

あなたが書いたクエリは属性fを選択しています。ただし、XQueryから属性ノードを返すことは違法です。エラーは、ここに属性のみが含まれている出力ドキュメントを参照しています(ただし、技術的にはここに出力ドキュメントがないため、このエラーメッセージは誤解を招く可能性がありますが、返されるのは属性ノードのみです)。

属性自体ではなく、属性の値を返したいと思われるかもしれません。

return data($foonode)
30
Oliver Hallam