评论单个节点

时间:2013-07-12 04:45:50

标签: xslt

使用XSLT,如何在不注释其子节点的情况下评论单个节点?

我有这个HTML:

<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处理器大喊: “在添加了text,comment,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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>