2010-09-14 107 views
2

我正在使用xsl腳本從xml的所有部分刪除註釋。它實際上是刪除父節點中的註釋,但不從其他內部節點註釋。xsl刪除所有節點的註釋

[編輯]

更新問題。我的要求是刪除整個XML文檔中的所有評論。

+0

你可能想編輯你的問題。我提供了一個與您的意見中的要求和說明相匹配的解決方案。 – 2010-09-14 16:19:07

回答

8

該轉化

<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()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="comment()"/> 
</xsl:stylesheet> 

當在含有註釋節點任何XML文檔應用,像這樣

<!-- foo --> 
<a> 
    <!-- bar --> 
    <b> 
     <c><!-- baz --></c> 
    </b> 
</a> 

產生想要的結果(在同一文檔以註釋節點剝離):

<a> 
    <b> 
     <c/> 
    </b> 
</a> 

請注意:最根本,最有力的XSLT的設計模式的使用 - 在身份規則的使用和壓倒一切的。

+2

+1,用於確定OP的真正含義。 :-) – LarsH 2010-09-14 17:00:24

+0

+1好猜!同樣只有'* | @ *'模式:複製元素和屬性以及其他節點類型的內置規則。但是我們喜歡這樣匹配身份規則......;) – 2010-09-14 18:00:53

+0

那麼,是否真的需要name =「identity」? – 2014-09-26 15:37:00

3

這聽起來像你想要複製只從輸入XML的評論。你是說你的樣式表複製了某些評論,但不是其他人?當你說「父節點中的註釋」時,你的意思是根節點的子節點(即所有元素之外)的子節點?

當我嘗試這種樣式表工作正常。具體的XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <comments> 
     <xsl:for-each select="//comment()"> 
      <comment><xsl:value-of select="."/></comment> 
     </xsl:for-each> 
     </comments> 
    </xsl:template> 
</xsl:stylesheet> 

對輸入

<?xml version="1.0" encoding="UTF-8"?> 
<!-- foo --> 
<a> 
    <!-- bar --> 
    <b> 
     <c><!-- baz --></c> 
    </b> 
</a> 

運行給出了輸出

<?xml version="1.0" encoding="utf-8"?> 
<comments> 
    <comment> foo </comment> 
    <comment> bar </comment> 
    <comment> baz </comment> 
</comments> 

如果這不是你想要的行爲,或者,如果你仍然無法在你的工作輸入,你可以發佈你的整個樣式表和你的輸入XML樣本,並顯示當前輸出是什麼?您還使用了哪種XSLT處理器?

+0

非常感謝您瞭解我的問題。我的期望是刪除所有評論,不論其位置如何,也不要將它們放在特定位置。對不起,質疑這個問題 – thndrkiss 2010-09-14 16:10:23

+0

+1爲解決問題所述。 :) – 2010-09-14 17:05:33

+0

@thndrkiss,好吧,我想你確實的意思是「刪除」評論並複製其他內容。令人困惑的是,您的示例XSLT試圖「移除」註釋,明確選擇註釋節點並故意將註釋放入輸出中。 ?!無論如何,看起來像@Dimitre你有覆蓋。 – LarsH 2010-09-14 17:14:00