2

我在以下 xml 上使用 xpath,我只需要提取匹配两个表达式的节点,也许我做错了,因为没有返回节点。

<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

我正在尝试选择子项等于“行业”且 id_product 子项等于“6”的所有项目元素

鉴于您的示例 XML 在元素值中有前导空格,您需要normalize-space在比较时使用:

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

顺序中的多个谓词表达式有效地与在一起,您可以将表达式读作

  1. 选择item文档中的所有元素
  2. 过滤这组节点以仅包括那些具有section其空间标准化值的子节点的节点industry
  3. 然后过滤集合以仅包含那些具有id_product空间标准化值的孩子的集合6

表达式 like//item/section[....]会选择section元素,而不是它的 parent item

于 2012-09-17T14:14:09.177 回答
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 回答