xpath:在不使用text()的情况下获取文本节点值

时间:2015-03-10 18:09:44

标签: xml xpath

我想知道在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()?

2 个答案:

答案 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元素的所有直接子文本节点