我在以下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"]
有人可以帮助我吗?
答案 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运算,您可以将表达式读作
item
元素section
子节点,其空间规范化值为industry
id_product
6
子项的
醇>
//item/section[....]
之类的表达式会选择section
元素,而不是其父item
。