我需要选择节点中的文本,而不是任何子节点。 xml看起来像这样
<a>
apples
<b><c/></b>
pears
</a>
如果我选择a/text()
,我得到的只是“ apples ”。如何省略{苹果梨'而省略<b><c/></b>
答案 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'