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
で、null 値の文字列と$node
、ノードを選択するための式です。$node
が複数のノードを含むノード セットに評価される場合、最初のノードの文字列値が使用されることに注意してください。
短い答え:いいえ。そのような関数は考慮され、XPath 仕様のバージョン 2 では明示的に拒否されました (非規範的なユーザー作成関数のセクションを参照してください)。
空のノードの場合は、
boolean(string-length($node))
number()
(ここでは boolean から number へのキャストが暗黙的に行われるため、への呼び出しは省略できます。)
@ジェロヴァート
したがって、これを正しく理解している場合は、デフォルトの回答とノードの値を連結し、ノードの存在をテストして結果の文字列の正しいサブセットを取得し、オフセットをゼロまたは私の直後の位置に設定します。デフォルト文字列。これは、私が今まで見た中で最もひねくれた言語です。(大好きです!)
あなたの言ったことを明確にするために、このアプローチは、ノードが空の場合ではなく、ノードが欠落している場合に機能します。しかし、"number(boolean($node))" を "string-length($node)" に置き換えることで、代わりに空のノードで動作します。
XPath 1.0 で実行できます。あなたが持っていると言う
<foo>
<bar/>
</foo>
子供がいるかどうかをテストしたい場合foo
は、baz
substring("N/A", 4 * number(boolean(/foo/baz)))
/foo/baz
式が空のノードセットを返す場合は「N/A」を返し、それ以外の場合は空の文字列を返します。