我需要在评论中显示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
中的代码。
如何在评论中显示项目?
答案 0 :(得分:11)
有可能替换
<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>
与
<xsl:text disable-output-escaping="yes"><!--</xsl:text>
<xsl:apply-templates select="image" />
<xsl:text disable-output-escaping="yes">--></xsl:text>
没试过。
答案 1 :(得分:7)
<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>
结果:
<!---->
这是元素中的代码 xsl:注释忽略
如果实例化它是一个错误 xsl:comment的内容创建节点 除文本节点外。一个XSLT 处理器可能发出错误信号;如果它 它不会发出错误的信号 通过忽略违规来恢复 节点及其内容。
如何在中显示项目 评论
这取决于“显示”的含义:在浏览器中:
<-- <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="/">
<-- Hello, World -->
<xsl:text disable-output-escaping="yes"><--</xsl:text>
Hello,world! --<xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:template>
</xsl:stylesheet>
此转换在应用于任何XML文档(未使用)时生成:
<-- Hello, World -->
<--
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="/">
<-- <xsl:apply-templates select="image"/> -->
</xsl:template>
<xsl:template match="image">
<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"/>
生成了想要的结果:
<--
<img src="http://example.com/yyy.jpg"
width="200px"
height="300px"/>
-->
在浏览器中查看为:
&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('<',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('<',name(),'>')"
disable-output-escaping="yes"/>
</xsl:template>
<xsl:template match="*[not(node())]" mode="encode">
<xsl:value-of select="concat('<',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(),'="',.,'"')"/>
</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"><!--</xsl:text><xsl:apply-templates select="image" /><xsl:text disable-output-escaping="yes">--></xsl:text>
而不是:
<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>
你将获得这个
<!-- <img src="path" width="100px" height="100px"/> -->
与msxml和saxon一起使用