1

「単語」ノードを含む「こんにちは」ノードを持つ XML ファイルがあります。

<doc>
    <hello>
        <word>Hello</word><word>World</word><word>!</word>
    </hello>
    <hello>
        <word>Hello</word><word>!</word><word>World</word>
    </hello>
    <hello>
        <word>Hello</word><word>World</word><word>!</word><word>blorf</word>
    </hello>
    <hello>
        <word>Hello</word><word>Wo</word><word>rld!</word>
    </hello>
</doc>

最初の だけを一致させたいhello。2 番目のものは順序が間違っており、3 番目のものは余分な単語があります。4 番目のテキストは正しいですが、単語の分割が正しくありません。


このクエリは XPath 1.0 で機能しますが、非常に冗長です。もっと簡単な方法はありますか?

//hello[count(word) = 3 and word[1] = "Hello" and word[2] = "World" and word[3] = "!"]

これは XPath 2.0 で機能します。XPath 1.0 で同等の処理を行う方法はありますか?

//hello[deep-equal(data(subsequence(word,1)),('Hello','World','!'))]
4

3 に答える 3

1

以下のXPATH 1.0を使用できます

//hello[
  word[1][
    .='Hello' and following-sibling::word[1][
      .='World' and following-sibling::word[1][
        .='!' and count(following-sibling::word)=0
      ]
    ]
  ]
]

出力

<hello>
    <word>Hello</word><word>World</word><word>!</word>
</hello>
于 2013-10-07T18:06:07.493 に答える
1

Hello ノード全体をテキストとして扱うだけです。

//hello[normalize-space(.) = "HelloWorld!"]
于 2013-10-07T23:16:02.910 に答える
1

XPath 2.0 を使用string-join()している場合は、区切り文字を追加して個々の単語を区切ることができます。

//hello[string-join(word,'|')='Hello|World|!']

normalize-space(word)空白を無視する必要がある場合は、使用する必要があるかもしれません。

別の XPath 2.0 の代替手段は、deep-equal()2 つのシーケンスを比較するために使用することです。テキスト値の一部である可能性のある区切り文字を使用していないため、これはより安全です。

//hello[deep-equal(data(subsequence(word,1)),('Hello','World','!'))]
于 2013-10-08T06:59:58.360 に答える