質問

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)」に置き換えることで、代わりに空のノードで動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top