我的XML文档具有任意嵌套的节。鉴于对特定部分的参考,我需要找到该部分中的所有TextNode
s 不包括第小节。查找除子节点以外的所有子级文本()节点
例如,给定到下面的#a1
节点的引用,我只需要找到“A1”和“A1”文本节点:
<root>
<section id="a1">
<b>A1 <c>A1</c></b>
<b>A1 <c>A1</c></b>
<section id="a1.1">
<b>A1.1 <c>A1.1</c></b>
</section>
<section id="a1.2">
<b>A1.2 <c>A1.2</c></b>
<section id="a1.2.1">
<b>A1.2.1</b>
</section>
<b>A1.2 <c>A1.2</c></b>
</section>
</section>
<section id="a2">
<b>A2 <c>A2</c></b>
</section>
</root>
如果它不明显,上述是组成数据。特别是id
属性可能不存在于真实世界的文档中。
我想出现在是找到部分中的所有文本节点,然后用Ruby减去那些我不想要最好的:
def own_text(node)
node.xpath('.//text()') - node.xpath('.//section//text()')
end
doc = Nokogiri.XML(mydoc,&:noblanks)
p own_text(doc.at("#a1")).length #=> 4
我可以制作一个单个XPath 1.0表达式直接查找这些节点?喜欢的东西:
.//text()[ancestor::section = self] # self being the original context node
您可以在不依赖'id'属性的情况下执行此操作吗?这只是一个演示文档,可以清楚地说明和讨论这一点。想象一下嵌套的''元素没有明显的属性。 –
Phrogz
是的,请参阅此答案的更新。 –
不错;我忘了使用'count()',但即使您开始使用它,我也无法弄清楚如何“存储”计数。这仍然不会直接在Ruby/XPath中工作(因为在启动新的上下文时,唯一的节点是'.'),但这似乎回答了通用XPath的问题。 – Phrogz