我想知道在xpath中使用text()的目的是什么。如果我有一个xml文档
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
我需要找到书的价格。我可以用: /书店/书籍/价格[text()]或 /书店/书/价格
它会给我同样的结果。那么为什么要使用text()?
答案 0 :(得分:2)
在这种特殊情况下没有理由使用text()
,并且text()
经常在XPath新手中过度使用。
text()
节点测试有一些有效的用例,它们涉及一个人想要专门定位文本节点的时间。
例如,假设某些图书的价格为空白而您只想获得非空白图书:
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<price></price>
</book>
<book category="CHILDREN">
<title lang="en">Narnia</title>
<price>29.99</price>
</book>
/bookstore/book/price
将返回三个元素,而/bookstore/book/price[text()]
将返回两个元素。
或者有时您可能只想获取元素的文本节点,而不是整个内容:
<book category="CHILDREN">
Harry Potter
<author>J. K. Rowling</author>
<price>29.99</price>
</book>
在这种情况下,/bookstore/book
将生成一个字符串值为Harry Potter J. K. Rowling29.99
的元素,而/bookstore/book/text()
将生成一组文本节点,第一个文本节点的字符串值为{ {1}},另外两个只是空白。
正如Michael Kay在评论中指出的那样,使用Harry Potter
在处理混合内容时很有用(其中文本节点与元素并排,如上面的第二个示例所示)。在极少数情况下,您需要将text()
与非混合内容一起使用。
答案 1 :(得分:0)
不,XPath表达式
/bookstore/book/price
不返回字符串值。它返回称为“price”的元素节点。但是您使用的XPath环境或引擎(我们不知道哪一个)会自动输出这些元素的字符串值。
例如,如果XPath与 XSLT 一起使用,就像在xsl:value-of
指令中一样,在许多情况下会发生这种情况:
<xsl:value-of select="price"/>
^^^^^^^^^^^^^^^^^^^^^^ ^^^ XSLT
^^^^^ XPath
上面,XSLT中的XPath表达式返回一个元素节点,但xsl:value-of
只输出该元素的字符串值。
在某些情况下,元素price
的字符串值与price/text()
不同,因为
元素的字符串值是其所有后代文本节点的串联
和
price/text()
返回price
元素的所有直接子文本节点