Xpath查找匹配两个表达式的节点

时间:2012-09-17 13:39:33

标签: javascript xml xpath

我在以下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"]

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

看起来您尝试匹配的节点中的文本以空格开头:

" industry"

" 8"

这就是section[text() = "industry"]没有选择任何内容的原因。

您可以使用

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

P.S。根据您之后的评论,您想要选择的内容似乎完全不同。您想要选择item,而不是其子项,并且您只希望两个条件成立的item个元素,而不是那些 的元素>条件成立。所以:

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

答案 1 :(得分: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"]

答案 2 :(得分:1)

  

我正在尝试选择所有项目元素,其中section child等于“industry”并且id_product child等于“6”

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

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

序列中的多个谓词表达式有效地进行AND运算,您可以将表达式读作

  1. 选择文档中的所有item元素
  2. 过滤此节点集,仅包含section子节点,其空间规范化值为industry
  3. 然后过滤 设置为仅包含那些空间规范化值为id_product
  4. 6子项的

    //item/section[....]之类的表达式会选择section元素,而不是其父item