使用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"><!--</xsl:text>
<xsl:copy>
<xsl:text disable-output-escaping="yes">--></xsl:text>
<xsl:apply-templates select="@* | node()"/>
<xsl:text disable-output-escaping="yes"><!--</xsl:text>
</xsl:copy>
<xsl:text disable-output-escaping="yes">--></xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 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"><!--</xsl:text>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:text disable-output-escaping="yes">--></xsl:text>
<xsl:apply-templates select="node()"/>
<xsl:text disable-output-escaping="yes"><!--</xsl:text>
</xsl:copy>
<xsl:text disable-output-escaping="yes">--></xsl:text>
</xsl:template>
</xsl:stylesheet>