私は、「検索」ノードから情報を読み取り、それを使用して検索を実行できるXpathステートメント(1.0)を作成しようとしています。XPath関数 'contains()'を使用して、検索パラメータが空白の場合、または何もない場合は何も返しません。
私はいくつかの素晴らしい進歩を遂げていましたが、(検索の値に使用される)属性が空であるか存在しない場合、失敗してしまうという問題を見つけました。例簡素化する
コード編集:だからここで
は私のサンプルXMLです:
<xml>
<files>
<file name="foo" description="" rating="4"/>
<file name="food" description="" rating="4"/>
<file name="foobar" description="" rating="3"/>
<file name="bar" description="" rating="3"/>
<file name="barter" description="" rating="3"/>
<file name="barterer" description="" rating="2"/>
</files>
<searches>
<search id="1">
<exclude>
<file term="foo"/>
</exclude>
</search>
</searches>
</xml>
と作業XPATH:
//files/file[
not(contains(@name, //search[@id='1']/exclude/file/@term))
]
期待どおりに動作します...
しかし、期待される属性i行方不明または空であれば動作しません。なぜなら:contains(@attrib、 "")は何らかの理由ですべてを照合するため、属性が ""であるか存在しない場合、not()は常に何も一致しません。
私はそれが失敗したこれにXMLのフラグメントを除外する変更した場合たとえば、:あまりにもこれに
<exclude>
<file term=""/>
</exclude>
:
<exclude></exclude>
を空の値をチェックしないようにする方法はあります選択を実行する?またはおそらくロジックを構成するためのより良い方法です。私はXpath2.0ではConditionalやその他の関数を使うことはできません。
あなたは、質問を編集して、検索の一致を見つけるためのルールを記述してくださいでした:私からアイデアを得たのはここ
です - 私は短い表現が使用できると思う。たとえば、 'cond1とcond2またはcond1またはcond2'は、より短い同等の式' cond1 or cond2'で簡単に置き換えることができます。 –
申し訳ありません。コード例を更新して、私の問題をより明確に指摘しました。 – Futile32
@ Futile32、たぶんあなたのXPathは名前= ""のノードを取得します。空でないので、何も取得しません。 –