比如我有這樣選擇節點沒有特定子
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
我如何使用XPath的XML樣本選擇節點a
只包含
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
比如我有這樣選擇節點沒有特定子
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
我如何使用XPath的XML樣本選擇節點a
只包含
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
不知道這是給你足夠的靈活性,但它應該讓你開始
/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]
你可以玩它很容易在這裏:http://www.xpathtester.com/test
此XPath:
//a[normalize-space(.)='A2 Text text text...']
只會選擇:
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
XSLT示例...
XML輸入
<doc>
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
</doc>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="//a[normalize-space(.)='A2 Text text text...']"/>
</xsl:template>
</xsl:stylesheet>
XML輸出
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
爲什麼downvote? –
也許是因爲XPath表達式根本沒有選擇節點? –
@DimitreNovatchev - 也許我誤解了這個問題。我以爲OP有兩個不同的'',只想選擇一個。在這種情況下,xpath會選擇'a'節點。我添加了一個例子來說明我的誤解。 –
XPath是一種查詢語言XML文檔。這意味着XPath表達式只能選擇一組節點和/或提取數據。
切記:XPath表達式永遠不會導致XML文檔結構的模塊化(例如刪除節點)。
答案是由於XML文檔中沒有這樣的節點,因此沒有XPath表達式將選擇您想要的節點。
你想可以很容易地使用XSLT使用XQuery來完成,(不是那麼容易)什麼:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'a1')]"/>
</xsl:stylesheet>
當這種變換所提供的XML文檔應用:
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2> Text
<strong>text</strong> text...
</a>
產生想要的正確結果:
<a>
<a2>A2</a2> Text
<strong>text</strong> text...
</a>
不完全是我想要的,但我已經能夠修改它。也感謝網站 –