質問
XPath を使用して XML ファイルからデータを抽出するアプリケーションがあります。XML ソース ファイル内のノードが欠落している場合は、値「N/A」を返します (Oracle NVL 関数と同様)。重要なのは、アプリケーションが XSLT をサポートしていないことです。XPathとXPathのみを使用してこれを実行したいと思います。
それは可能ですか?
解決
これは実行できますが、ノードが存在する場合の戻り値が次の場合に限られます。 ノード自体ではなく、ノードの文字列値. 。XPath
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
の文字列値を返します baz
存在する場合は要素、存在しない場合は文字列「N/A」。
このアプローチを一般化すると、次のようになります。
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
どこ $null-value
はヌル値文字列であり、 $node
ノードを選択する式。場合に注意してください。 $node
複数のノードを含むノードセット、つまり、 初め ノードが使用されます。
他のヒント
短い答え:いいえ。このような関数は XPath 仕様のバージョン 2 で検討され、明示的に拒否されました (非規範的な関数を参照) ユーザー作成関数のセクションの例).
空のノードの場合は、次のものが必要です
boolean(string-length($node))
(への呼び出しは省略できます number()
ここではブール値から数値へのキャストが暗黙的に行われているためです。)
XPath 1.0 で実行できます。持っていると言ってください
<foo>
<bar/>
</foo>
テストしたい場合は、 foo
があります baz
子供、
substring("N/A", 4 * number(boolean(/foo/baz)))
式の場合は「N/A」を返します。 /foo/baz
空のノードセットを返します。それ以外の場合は、空の文字列を返します。
@jelovirt
したがって、これを正しく理解していれば、デフォルトの答えとノードの値を連結し、ノードの存在をテストして結果の文字列の正しいサブセットを取得し、オフセットをゼロまたは私の直後の位置に設定します。デフォルトの文字列。それは私がこれまで見た中で最もひねくれた言語のねじれです。(大好きです!)
あなたが言ったことを明確にするために、このアプローチは、ノードが空の場合ではなく、ノードが欠落している場合に機能します。ただし、「number(boolean($node))」を「string-length($node)」に置き換えることで、代わりに空のノードで動作します。