2011-09-30 66 views
3

這是我的問題...我需要選擇整個xml文檔中的所有內容,但是隻留下一個標籤。不幸的是,這個標籤可能會有所不同。使用XQUERY消除XML中的單個元素類型

使用下面的代碼示例,我想要刪除所有<crud>,<crud2><...>(等)元素。 <crud>可能會有更多的孩子,但我不希望他們反正。

<body> 
    <h2/> 
    <crud> 
    <crud2/> 
    <...> 
    </crud> 
    <div> 
    <p> </p> 
    </div> 
    <div> 
    <p> 
    </p> 
    <crud> 
     <crud2/> 
     <...> 
    </crud> 
    </div> 
</body> 

我試過幾種方法。

let $body := "the xml sample" 
return $body/*[fn:not(descendant-or-self::crud)] 

這種方法需要很多。它將刪除包含crud的整個<div>塊,但我需要包含<div><p>。 所有其他方法似乎只刪除<body>的子代<crud>,或者也將其移除。

所以,我基本上需要一種方法,達到每個元素,並刪除所有的<crud>而不採取任何其他措施。

最終的XML應該是這樣的:

<body> 
    <h2/> 
    <div> 
    <p> </p> 
    </div> 
    <div> 
    <p> 
    </p> 
    </div> 
</body> 

我非常感謝任何及所有的幫助。

回答

3

這種處理是最容易使用XSLT完成,這比XQuery的更有表現力:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 


<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="crud"/> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<body> 
    <h2/> 
    <crud> 
     <crud2/> 
    </crud> 
    <div> 
     <p> </p> 
    </div> 
    <div> 
     <p>  </p> 
     <crud> 
      <crud2/> 
     </crud> 
    </div> 
</body> 

想要的,正確的結果產生

<body> 
    <h2/> 

    <div> 
     <p> </p> 
    </div> 
    <div> 
     <p>  </p> 

    </div> 
</body> 

說明

  1. 身份規則副本的每個節點「原樣。

  2. 單個模板覆蓋身份規則/模板。它匹配anu crud元素,其空主體結果爲crud(以及由其排序的任何子樹)將被剝離輸出。

+0

謝謝你的幫助。我現在走在正確的軌道上,但我似乎還有一個問題。如果在整個文檔中使用命名空間標記crud,會怎麼樣?所以''實際上是''。我已將xslt中的匹配更改爲some:crud,但現在我得到了「前綴某些沒有名稱空間綁定」。 – SpockJenkins

+0

哦..明白了。在根標籤中聲明名稱空間。 ''。再次感謝您的幫助。 – SpockJenkins

0

這是使用XQuery Update及其copy-statement一件容易的事:

copy $c := . 
modify delete node $c//crud 
return $c 

如果你可以改變你的原始文件,你甚至可以用更短的delete node //crud