XPath仅选择子元素(而不是空白文本节点)



我正在使用Nokogiri和XPath解析一些XML。当我这样做时:

doc.xpath('//Order/child::node()').each do |node|
  puts node.name
end

它打印出所有节点,但在名称之间,它也打印出"文本"。我想我知道为什么:

在我的xml中,节点之间有这样的空格:"<a1>hi</a1> n <a2>bye</a2>"

有没有一种方法可以告诉它忽略节点之间的东西?

使用

//Order/node()[not(self::text()[not(normalize-space())])]

这将选择任何Order元素的所有子节点,但完全由空白组成的文本节点除外。

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <xsl:variable name="vSel1" select="//Order/node()"/>
     <xsl:variable name="vSel2" select=
     "//Order/node()[not(self::text()[not(normalize-space())])]"/>
     <xsl:for-each select="$vSel1">
       <xsl:value-of select="concat('&#xA;',position(), ': ')"/>
       <xsl:copy-of select="."/>
       <xsl:text>&#xA;</xsl:text>
     </xsl:for-each>
================
     <xsl:for-each select="$vSel2">
       <xsl:value-of select="concat('&#xA;',position(), ': ')"/>
       <xsl:copy-of select="."/>
       <xsl:text>&#xA;</xsl:text>
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下XML文档时

<t>
 <Order>
  <a/>
  <b>xxx</b>
  <c/>
 </Order>
 <Order>
  <d/>
  <e>xxx</e>
  <f/>
 </Order>
</t>

计算两个XPath表达式,并输出两个相应的选定节点集的节点,每个节点前面都有其位置号

1: 

2: <a/>
3: 

4: <b>xxx</b>
5: 

6: <c/>
7: 

8: 

9: <d/>
10: 

11: <e>xxx</e>
12: 

13: <f/>
14: 

================
1: <a/>
2: <b>xxx</b>
3: <c/>
4: <d/>
5: <e>xxx</e>
6: <f/>

如果您只想要元素,请使用更好的XPath:请求/*会找到所有子元素:

require 'nokogiri'
doc = Nokogiri.XML("<r><a>1</a>nt<b>2</b></r>")
p doc.xpath('/r/child::node()').map(&:name)
#=> ["a", "text", "b"]
p doc.xpath('/r/*').map(&:name)
#=> ["a", "b"]

或者,你可以要求Nokogiri扔掉任何只有空白的文本注释:

doc2 = Nokogiri.XML("<r><a>1</a>nt<b>2</b></r>",&:noblanks)
p doc2.xpath('/r/child::node()').map(&:name)
#=> ["a", "b"]

或者,您可以使用Ruby根据任意标准进一步过滤NodeSet:

mine = doc.xpath('/r/child::node()').select do |node| 
  node.type != Nokogiri::XML::Node::TEXT_NODE || node.content =~ /S/
end
p mine.map(&:name)
#=> ["a", "b"]

相关内容

  • 没有找到相关文章

最新更新