10

XPath を使用して XML ファイルからデータを抽出するアプリケーションがあります。その XML ソース ファイル内のノードが欠落している場合は、"N/A" という値を返します (Oracle NVL 関数によく似ています)。秘訣は、アプリケーションが XSLT をサポートしていないことです。XPath と XPath のみを使用してこれを行いたいと思います。

それは可能ですか?

4

5 に答える 5

5

これは実行できますが、ノードが存在する場合の戻り値がノード自体ではなく、ノードの文字列値である場合に限ります。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が複数のノードを含むノード セットに評価される場合、最初のノードの文字列値が使用されることに注意してください。

于 2008-09-03T03:58:06.863 に答える
3

短い答え:いいえ。そのような関数は考慮され、XPath 仕様のバージョン 2 では明示的に拒否されました (非規範的なユーザー作成関数のセクションを参照してください)。

于 2008-09-02T20:01:25.993 に答える
2

空のノードの場合は、

boolean(string-length($node))

number()(ここでは boolean から number へのキャストが暗黙的に行われるため、への呼び出しは省略できます。)

于 2008-09-04T03:28:57.423 に答える
1

@ジェロヴァート

したがって、これを正しく理解している場合は、デフォルトの回答とノードの値を連結し、ノ​​ードの存在をテストして結果の文字列の正しいサブセットを取得し、オフセットをゼロまたは私の直後の位置に設定します。デフォルト文字列。これは、私が今まで見た中で最もひねくれた言語です。(大好きです!)

あなたの言ったことを明確にするために、このアプローチは、ノードが空の場合ではなく、ノードが欠落している場合に機能します。しかし、"number(boolean($node))" を "string-length($node)" に置き換えることで、代わりに空のノードで動作します。

于 2008-09-03T13:54:31.093 に答える
1

XPath 1.0 で実行できます。あなたが持っていると言う

<foo>
  <bar/>
</foo>

子供がいるかどうかをテストしたい場合fooは、baz

substring("N/A", 4 * number(boolean(/foo/baz)))

/foo/baz式が空のノードセットを返す場合は「N/A」を返し、それ以外の場合は空の文字列を返します。

于 2008-09-03T03:40:27.683 に答える