从节点中选择文本并省略子节点

时间:2011-03-03 14:47:22

标签: xpath xquery

我需要选择节点中的文本,而不是任何子节点。 xml看起来像这样

<a>
  apples  
  <b><c/></b>
  pears
</a>

如果我选择a/text(),我得到的只是“ apples ”。如何省略{苹果梨'而省略<b><c/></b>

3 个答案:

答案 0 :(得分:4)

路径a/text()选择a元素的所有文本子节点,以便在我的视图中路径正确。仅当您使用该路径时,例如XSLT 1.0和<xsl:value-of select="a/text()"/>它将输出第一个选定节点的字符串值。在XPath 2.0和XQuery 1.0中:string-join(a/text()/normalize-space(), ' ')产生字符串apples pears,这可能对您的问题有帮助。如果没有,那么请考虑解释在哪个上下文中使用XPath或XQuery,以便a/text()仅返回第一个选定节点的(字符串?)值。

答案 1 :(得分:0)

要检索所有后代,我建议使用//表示法。这将返回元素下面的所有文本后代。下面是一个xquery片段,它获取所有后代文本节点,并像Martin所说的那样格式化。

xquery version "1.0";
let $a := 
<a>
  apples  
  <b><c/></b>
  pears
</a>
return normalize-space(string-join($a//text(), " "))

或者,如果您有自己的格式要求,则可以通过循环遍历以下xquery中的每个文本元素来开始。

xquery version "1.0";
let $a := 
<a>
  apples  
  <b><c/></b>
  pears
</a>
for $txt in $a//text()
return $txt

答案 2 :(得分:0)

  

如果我选择/ text(),我得到的就是   “苹果”。我将如何改变“苹果   梨“

只需使用

normalize-space(/)

<强>解释

文档的根节点(/)的字符串值是其所有文本节点后代的串联。因为只有空白文本节点,我们需要消除这些不需要的文本节点。

以下是一个小型演示此解决方案的工作原理及其产生的结果:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  '<xsl:value-of select="normalize-space()"/>'
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<a>
 apples
    <b><c/></b>
 pears
</a>

产生了想要的正确结果:

  'apples pears'