2016-04-26 10 views
1

XPathを使用して、同じ単語で終わるいくつかのノードを選択し、それらがすべて互いに等しいかどうかをチェックしたいと思います。たとえば、ノードの集合が互いに等しいかどうかのチェックXPath 1.0

<a> 
    <b-token>123456789</b-token> 
    ... 
    <c> 
     <d> 
      <d-token>123456789</d-token> 
      ... 
     </d> 
     <e> 
      <e-token>123456789</e-token> 
      ... 
     </e> 
     <f> 
      <f-token>123456789</f-token> 
      ... 
     </f> 
    <c> 
</a> 

"-token"で終わるすべてのノードを検索し、それらが同等であることを確認したいと思います。 XPath 1.0でこれを行うことはできますか? 2.0? XSD?ここで

は私も働いていた例のXPathであるが、それはそれは私がそうのように「=」の後に特定の値を入れたときに動作しない

String xpathExpression = "/descendant-or-self::node()/*[substring(name(), string-length(name()) - (string-length('token')-1)) = 'token'] = /descendant-or-self::node()/*[substring(name(), string-length(name()) - (string-length('token')-1)) = 'token']"; 

ん:

String xpathExpression = "/descendant-or-self::node()/*[substring(name(), string-length(name()) - (string-length('token')-1)) = 'token'] = '123456789'"; 

Java 7を使用しています。

おかげ

答えて

0

あなたは、その文字列の内容は同じではない少なくとも1つの要素がある場合は、これらすべての要素が同じ文字列値とfalseを持っているように比較は限り真与えることが、その後not(//*[substring(local-name(), string-length(local-name()) - 5) = '-token'] != //*[substring(local-name(), string-length(local-name()) - 5) = '-token'])を使用している場合。

+0

これは動作しているようです。しかし、私は理由に従っていない。あなたが単純に私が行ったのは、ノードの2つのセットが '!='であるかどうかを比較することです。そして、 'not()'のすべてをラップすることで、そのブール値の反対を取ることになります。私にとっては論理的には同じですが、明らかにそうではありません。 – jediwompa

+0

XPathでは、 '$ node-set1!= $ node-set2'の比較は、' $ node-set1'の少なくとも一つの項目が '$ node-set2'の(少なくとも)一つの項目と等しくなければ真です。否定ではない($ node-set1!= $ node-set2) '我々はすべての項目が等しいことを保証する。 https://www.w3.org/TR/xpath/#booleansを参照してください。「比較対象の両方のオブジェクトがノードセットである場合、最初のノードにノードがある場合にのみ比較が行われます。 2つのノードの文字列値に対する比較を実行した結果が真であるように、第2のノード集合内のノードとの間の距離を計算する。 –

+0

OK、徹底的な説明をありがとう!私はupvoteをしたいと思いますが、私は今のところ辛口です。 – jediwompa