Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 从节点中选择文本并忽略子节点_Xpath_Xquery - Fatal编程技术网

Xpath 从节点中选择文本并忽略子节点

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

我需要选择节点中的文本,但不选择任何子节点。 xml如下所示

<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'