Xpath 从节点中选择文本并忽略子节点
我需要选择节点中的文本,但不选择任何子节点。 xml如下所示Xpath 从节点中选择文本并忽略子节点,xpath,xquery,Xpath,Xquery,我需要选择节点中的文本,但不选择任何子节点。 xml如下所示 <a> apples <b><c/></b> pears </a> 苹果 梨 如果我选择a/text(),我得到的只是“apples”。如何在省略的同时检索“苹果梨”,路径a/text()选择a元素的所有文本子节点,以便路径在我的视图中是正确的。仅当将该路径与XSLT 1.0和一起使用时,它才会输出第一个选定节点的字符串值。在XPath 2.0和XQue
<a>
apples
<b><c/></b>
pears
</a>
苹果
梨
如果我选择
a/text()
,我得到的只是“apples”。如何在省略
的同时检索“苹果梨”,路径a/text()
选择a
元素的所有文本子节点,以便路径在我的视图中是正确的。仅当将该路径与XSLT 1.0和
一起使用时,它才会输出第一个选定节点的字符串值。在XPath 2.0和XQuery 1.0中:string连接(a/text()/normalize-space(),“”)
生成字符串苹果梨
,因此这可能有助于解决您的问题。如果没有,那么请考虑在哪种上下文中使用XPath或XQuery,以便<代码> A/TeX()/代码>只返回第一个选定节点的(String?)值。 使用//符号检索我建议的所有子体。这将返回元素下的所有文本子体。下面是一个xquery片段,它获取所有子体文本节点,并按照Martin的指示对其进行格式化
xquery version "1.0";
let $a :=
<a>
apples
<b><c/></b>
pears
</a>
return normalize-space(string-join($a//text(), " "))
xquery版本“1.0”;
租$a:=
苹果
梨
返回规范化空间(字符串联接($a//text(),“”))
或者,如果您有自己的格式要求,您可以在下面的xquery中循环遍历每个文本元素
xquery version "1.0";
let $a :=
<a>
apples
<b><c/></b>
pears
</a>
for $txt in $a//text()
return $txt
xquery版本“1.0”;
租$a:=
苹果
梨
对于$a//text()中的$txt
返回$txt
如果我选择了/text(),我得到的只是
“苹果”。我怎样才能找回“苹果”
梨“
只需使用:
normalize-space(/)
说明:
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>
我在php脚本中使用它,我的XSLT版本绝对是1.0.+1正确的解释。XPath
string()
函数也会将节点集强制转换为单例。Dave,即使使用XPath 1.0,路径表达式a/text()
也会生成一个包含两个文本节点的节点集。如果只得到一个结果,那么您可能希望向我们展示执行XPath查询的PHP代码,以便我们可以尝试确定为什么只得到一个结果。如果使用,则在返回的节点列表中应该有两个节点。您编写了“检索所有子体[…]”。没人问这个问题。问得好,+1。请参阅我的答案,以获得完整、非常简短和简单的XPath解决方案,并获得解释。:)
'apples pears'