我的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