2012-05-03 134 views
1

比如我有這樣選擇節點沒有特定子

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

回答

1

不知道這是給你足夠的靈活性,但它應該讓你開始

/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))] 

你可以玩它很容易在這裏:http://www.xpathtester.com/test

+0

不完全是我想要的,但我已經能夠修改它。也感謝網站 –

0

此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> 
+0

爲什麼downvote? –

+0

也許是因爲XPath表達式根本沒有選擇節點? –

+0
1

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> 
相關問題