注释中的输出元素

时间:2010-10-14 10:19:45

标签: xslt

我需要在评论中显示HTML元素(例如)

<!-- <img src="path" width="100px" height="100px"/> -->

我使用这种方法

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no" encoding="windows-1251"/>

    <xsl:template match="myNode">
        ...
        <xsl:comment><xsl:apply-templates select="image" /></xsl:comment>
        ...
    </xsl:template>

    <xsl:template match="image">
        <img src="{@src}" width="{@width}px" height="{@height}px" />
    </xsl:template>

</xsl:stylesheet>

结果:

<!---->

忽略了元素xsl:comment中的代码。

如何在评论中显示项目?

4 个答案:

答案 0 :(得分:11)

有可能替换

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
<xsl:apply-templates select="image" />
<xsl:text disable-output-escaping="yes">--&gt;</xsl:text>

没试过。

答案 1 :(得分:7)

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>
     

结果:

<!---->
     

这是元素中的代码   xsl:注释忽略

The XSLT 1.0 Spec

  

如果实例化它是一个错误   xsl:comment的内容创建节点   除文本节点外。一个XSLT   处理器可能发出错误信号;如果它   它不会发出错误的信号   通过忽略违规来恢复   节点及其内容。

     

如何在中显示项目   评论

这取决于“显示”的含义:在浏览器中:

&lt;-- <xsl:apply-templates select="image" /> -->

可能很有用,前提是<xsl:apply-templates/>的结果只是简单的文本(不是标记)。

如果要“显示”表示将结果作为文本提供,那么DOE(如果XSLT处理器允许)可能会给我们想要的结果:

&LT; -    一些文字 - &gt;

最后,如果要求“评论”中的内容应该是标记并且它应该显示为标记,那么这是相当具有挑战性的。在这种情况下,必须使用:

<xsl:output method="text"/>

并且应该为每个XML词汇项目提供所需的序列化(即转义)。

这是XPath Visualizer构造其输出的方式。

这是一个小变换,演示了前两种方法

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

 <xsl:template match="/">
      &lt;-- Hello, World -->

  <xsl:text disable-output-escaping="yes">&lt;--</xsl:text>
   Hello,world! --<xsl:text disable-output-escaping="yes">&gt;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

此转换在应用于任何XML文档(未使用)时生成

      &lt;-- Hello, World --&gt;

  <--
   Hello,world! -->

两个“评论”都可以在浏览器中被视为评论,而只有第二个评论在自由文本中显示为评论。

第三种方法(最可能是您想要的)如下所示

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

 <xsl:template match="/">
  &lt;-- <xsl:apply-templates select="image"/> -->

 </xsl:template>

 <xsl:template match="image">
  &lt;img src="<xsl:value-of select="@src"/>"
      width="<xsl:value-of select="@width"/>px"
      height="<xsl:value-of select="@height"/>px"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<image src="http://example.com/yyy.jpg" width="200" height="300"/>

生成了想要的结果

  &lt;-- 
  &lt;img src="http://example.com/yyy.jpg"
      width="200px"
      height="300px"/&gt;
  --&gt;

在浏览器中查看为

&LT; -   &lt; img src =“http://example.com/yyy.jpg”       宽度=“200像素”       高度= “300像素”/&GT;    - &GT;

答案 2 :(得分:1)

来自http://www.w3.org/TR/xslt#section-Creating-Comments

实例化xsl:comment元素以在结果树中创建注释节点。 xsl:comment元素的内容是注释节点的字符串值的模板。

  

例如,这个

     

<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>

     

会创建评论

     

<!--This file is automatically generated. Do not edit!-->

     

如果实例化它是一个错误   xsl:comment的内容创建节点   除文本节点外。一个XSLT   处理器可能发出错误信号;如果它   它不会发出错误的信号   通过忽略违规来恢复   节点及其内容。

     

如果结果是错误的   实例化的内容   xsl:comment包含字符串--或   以-结尾。 XSLT处理器可以   发出错误信号;如果没有   发出错误信号,它必须恢复   在任何事件发生后插入空格   -之后是另一个-或。{   结束评论。

因此,为了做你想做的事,你需要使用DOE机制。

例如,这个样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 exclude-result-prefixes="msxsl">
    <xsl:output method="html" indent="no" encoding="windows-1251"/>
    <xsl:template match="img">
        <img src="{.}"/>
    </xsl:template>
    <xsl:template match="root">
        <xsl:variable name="vResult">
            <xsl:apply-templates/>
        </xsl:variable>
        <html>
            <xsl:copy-of select="$vResult"/>
            <xsl:comment>
                <xsl:apply-templates select="msxsl:node-set($vResult)"
                                     mode="encode"/>
            </xsl:comment>
        </html>
    </xsl:template>
    <xsl:template match="*" mode="encode">
        <xsl:value-of select="concat('&lt;',name())"
                      disable-output-escaping="yes"/>
        <xsl:apply-templates select="@*" mode="encode"/>
        <xsl:text>></xsl:text>
        <xsl:apply-templates mode="encode"/>
        <xsl:value-of select="concat('&lt;',name(),'>')"
                      disable-output-escaping="yes"/>
    </xsl:template>
    <xsl:template match="*[not(node())]" mode="encode">
        <xsl:value-of select="concat('&lt;',name())"
                      disable-output-escaping="yes"/>
        <xsl:apply-templates select="@*" mode="encode"/>
        <xsl:text>/></xsl:text>
    </xsl:template>
    <xsl:template match="@*" mode="encode">
        <xsl:value-of select="concat(' ',name(),'=&quot;',.,'&quot;')"/>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<root>
    <img>http://example.org/image1.jpg</img>
    <img>http://example.org/image2.jpg</img>
    <img>http://example.org/image3.jpg</img>
</root>

输出:

<html>
    <img src="http://example.org/image1.jpg">
    <img src="http://example.org/image2.jpg">
    <img src="http://example.org/image3.jpg">
    <!--<img src="http://example.org/image1.jpg"/>
        <img src="http://example.org/image2.jpg"/>
        <img src="http://example.org/image3.jpg"/>-->
</html>

注意node-set扩展功能,用于两次传递转换。 disable-output-escaping指令的xsl:value-of属性。

答案 3 :(得分:0)

如前所述,Dimitri你不能使用xsl:comment指令。

如果你的目的只是评论一个树的片段,最简单的方法是将评论标记作为文本(未转义)放在这样:

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text><xsl:apply-templates select="image" /><xsl:text disable-output-escaping="yes">--&gt;</xsl:text>

而不是:

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>

你将获得这个

<!-- <img src="path" width="100px" height="100px"/> -->

与msxml和saxon一起使用