2013-07-12 76 views
1

使用XSLT,如何評論單個節點而不評論其子節點?評論單個節點

我有這個網站:

<html> 
    <body> 
    <div class="blah" style="blahblah"> 
     <span> 
     <p>test</p> 
     </span> 
    </div> 
    </body> 
</html> 

我想這樣的輸出:

<html> 
    <body> 
    <!-- div class="blah" style="blahblah" --> 
     <span> 
     <p>test</p> 
     </span> 
    <!-- /div --> 
    </body> 
</html> 

這是關鍵的節點被複制的孩子和評論節點的任何屬性也將被複制。

以下是我的最佳嘗試,但不起作用。 XSLT處理器大喊: 「在添加了文本,註釋,pi或子元素節點後,不能將屬性和命名空間節點添加到父元素中。」

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="div"> 
     <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
     <xsl:copy> 
     <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
      <xsl:apply-templates select="@* | node()"/> 
     <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
     </xsl:copy> 
     <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

回答

0

這是一個非常可怕的使用XSLT,但是這似乎工作,我想不出一個更清潔方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="div"> 
    <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
     <xsl:apply-templates select="node()"/> 
     <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
    </xsl:copy> 
    <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

我無法想象,你爲什麼會不使用'' 。 – 2013-07-12 05:28:39

+0

接受這個答案,因爲它比樂高的短,似乎更簡單。 – DaVinci007

+0

@torazaburo我試過了,但無法啓動它。另外,它不會造成錯誤的嵌套? – DaVinci007

1

它值得指出的是,你可以只使用<xsl:comment>創建輸出XML中的註釋,而不必擔心正確關閉它們。如果關閉註釋分隔符未正確放入,您所做的操作可能會輕易導致問題發生。

這將這樣的伎倆:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="div"> 
     <xsl:comment> 
      <xsl:text> div </xsl:text> 
      <xsl:for-each select="@*"> 
       <xsl:value-of select="local-name()"/> 
       <xsl:text>="</xsl:text> 
       <xsl:value-of select="."/> 
       <xsl:text>" </xsl:text> 
      </xsl:for-each> 
     </xsl:comment> 
     <xsl:apply-templates select="./*" /> 
     <xsl:comment> /div </xsl:comment> 
    </xsl:template> 

</xsl:stylesheet> 

倒打印輸出時,給出了這樣的:

<html> 
    <body> 
     <!-- div class="blah" style="blahblah" --> 
     <span> 
     <p>test</p> 
     </span> 
     <!-- /div --> 
    </body> 
</html> 
+0

謝謝樂高!我希望我可以選擇一個以上的答案,因爲你的答案似乎提供了一個更爲標準的方式,因爲它使用了 DaVinci007