2016-09-22 159 views
1

我現在閱讀了很多(也許是全部)關於排除XPath元素的帖子,我只是沒有得到這個工作。我不知道爲什麼。XPath排除某些XML元素?

比方說,我有以下結構:

<root> 
    <elemA> 
     Hello World! 
    </elemA> 
    <elemB> 
     This is awesome! 
     <elemC>Really!</elemC> 
    </elemB> 
</root> 

沒有我想除了elemC所有元素。

基於我已閱讀,我試過以下的XPath:

選項1:

//*[not(self::elemC)] 

選項2:

//*[not(name()='elemC')] 

方案3:

//*[name()!='elemC'] 

我不知道爲什麼這不起作用,但懷疑有些愚蠢的錯誤。如果我做的確相反(即省略not!),則XPath會正確選擇elemC元素。

結果應該是這樣的:

<root> 
    <elemA> 
     Hello World! 
    </elemA> 
    <elemB> 
     This is awesome! 
    </elemB> 
</root> 
+0

這是一個很好表達的問題,涉及一類XPath(單獨)無法解決的問題。有關更多詳細信息,請參見[我的答案](http://stackoverflow.com/a/39640786/290085)。 – kjhughes

回答

2

XPath是用於選擇。您想要選擇的內容在您的XML文檔中不存在。

您需要其他工具,如XSLT根據輸入XML文檔生成XML輸出文檔。 XSLT可以通過輔以抑制元素的複製,你不希望(elemC)一個簡單的模板身份轉變平凡生成所需輸出:單獨

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="elemC"/> 
</xsl:stylesheet> 

的XPath也幫不了你。

+1

非常感謝。這真的有助於澄清。想知道爲什麼我總是能夠理解其他問題:「用XPath排除元素x」與我的意思相同。無論如何,我會嘗試XSLT。一旦知道使用什麼工具,似乎並不複雜。 –

+0

您當然可以從其他選定節點的列表中排除節點,但不能在沒有子節點'elemC'的情況下選擇'elemB',因爲XML中不存在這樣的'elemB'。 – kjhughes