2

次のxmlでxpathを使用しています。2つの式に一致するノードのみを抽出する必要があります。ノードが返されないため、間違っている可能性があります。

<item>
    <title>a product</title>
    <link>http://www.aproduct.com</link>
    <description>cool product</description>
    <author>here@there.com</author>
    <id_product><![CDATA[ 6]]></id_product>
    <section><![CDATA[ industry]]></section>
</item>
<item>
    <title>another product</title>
    <link>http://www.anotherproduct.com</link>
    <description>awesome product</description>
    <author>here@there.com</author>
    <id_product><![CDATA[ 8]]></id_product>
    <section><![CDATA[ diy]]></section>
</item>

私が今使っているのは、

//item/section[text() = "industry"] | //item/id_product[ text() ="6"]

しかし、私も試しました

//item/section[ . = "industry"] | //item/id_product[ . ="8"]

誰でも私を助けることができますか?

4

3 に答える 3

1

一致させようとしているノード内のテキストがスペースで始まっているようです:

" industry"

" 8"

これが、section[text() = "industry"]何も選択しない理由です。

あなたが使用することができます

//item/section[normalize-space(.) = "industry"] | ...

PSその後のコメントに基づいて、選択したいものがかなり異なっているようです。itemその子ではなくを選択する必要があり、どちらかの条件が真である要素ではなく、両方の条件が真でitemある要素のみが必要です。そう:

//item[section[normalize-space(.) = "industry"] and 
       id_product[normalize-space(.) = "6"]]
于 2012-09-17T13:47:22.900 に答える
1

fn:normalize-space(string)xpath 1.0 関数を使用できます。

Xpathは次のようになります

//item/section[normalize-space(.) = "industry"] 
| 
//item/id_product[ normalize-space(.) ="6"]

更新: OP コメントに基づいて、子が保持する値に基づいて選択されるすべての項目ノードを理解しています。したがって、この式は

//item[normalize-space(section) = "industry" or normalize-space(id_product) ="6"]
于 2012-09-17T14:09:20.240 に答える
1

section 子が「industry」に等しく、id_product 子が「6」に等しいすべての item 要素を選択しようとしています

サンプル XML の要素値に先頭のスペースがある場合normalize-space、比較するときに次を使用する必要があります。

//item[normalize-space(section) = "industry"][normalize-space(id_product) = "6"]

連続する複数の述語式は、効果的に AND 結合されます。式は次のように読むことができます。

  1. itemドキュメント内のすべての要素を選択する
  2. このノードのセットをフィルタリングして、section空間正規化値がindustry
  3. 次に、そのセットをフィルタリングしてid_product、空間正規化値が6

次のような式は、親ではなく要素//item/section[....]を選択します。sectionitem

于 2012-09-17T14:14:09.177 に答える