2008-09-02 9 views
8

私はXPathを使用してXMLファイルからデータを抽出するアプリケーションを持っています。そのXMLソースファイル内のノードが見つからない場合は、「N/A」という値を返したい(OracleのNVL関数とよく似ている)。そのトリックは、アプリケーションがXSLTをサポートしていないことです。私はこれをXPathとXPathだけで使いたいと思っています。XPathで欠落しているタグの値を作成できますか?

これは可能ですか?

答えて

5

ノードが存在するときの戻り値がの場合のみ、ノード自身の文字列値ではなく、ノード自体です。それが存在する場合のXPath

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

は、そうでなければ、文字列「N/A」、baz要素の文字列値を返します。

$null-valueがヌル値文字列及びノードを選択する $node式で
substring(concat($null-value, $node), 
      (string-length($null-value) + 1) * number(boolean($node))) 

:アプローチを一般化

$nodeが複数のノードを含むノードセットに評価された場合、の最初の文字列値はです。

3

短い回答:いいえ。そのような関数は、XPath仕様のバージョン2(XPath仕様の非標準であるIllustrative User-written Functions sectionを参照)に対して考慮され、明示的に拒否されました。

1

XPath 1.0で行うことができます。それ以外の場合はを返し、あなたはfoobaz子供を持っているかどうかをテストしたい場合は、空のノードセットを返す/foo/baz表現ならば、

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

は「N/A」を返します

<foo> 
    <bar/> 
</foo> 

を持っていると言います空の文字列

1

@jelovirt

私はこれを正しく理解してあれば、我々はデフォルトの回答とノードの値を連結した後、設定したノードが存在するかどうかを試験することにより、結果の文字列の正しいサブセットを取りますゼロまたはデフォルトの文字列の直後の位置にオフセットします。それは私が今までに見た言語の中で最もひどいひねりです。 (私はそれが大好きです!)

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

2

、あなたは(数にブールからキャストがここに暗黙的であるとして、あなたはnumber()への呼び出しを省略することができます。)

boolean(string-length($node)) 

が必要

関連する問題