我有以下xsl文档:http://jsfiddle.net/Abadi/92ndrnut/2/。我需要添加:停用-输出-转义=“yes”。因为当它被应用于:
<CARRIERNAME>
<![CDATA[AT&T]]>
</CARRIERNAME>.它正在产生:AT&T。
应用的模板为:
<xsl:value-of select="CARRIERNAME" />。
当我将其更新为:
<xsl:value-of select="CARRIERNAME" disable-output-escaping="yes" />,
它起作用了,输出是:AT&T。
我的问题是如何向xsl文档添加disable-output-escaping="yes“,这样它就可以应用于所有模板。
更改应该发生在链接中提供的xsl文档中。或者是否有不同的方法。我是xslt新手,非常感谢您的帮助。
发布于 2015-09-02 15:29:57
我的问题是如何将disable-output-
=“yes”添加到xsl文档中,以便它可以应用于所有模板。
这是XSLT2.0的一个特性,在XSLT2.0中,disable-output-escaping被认为是不推荐使用的,并被xsl:character-maps取代。这些字符映射可以应用于整个输出。
请注意,<![CDATA[AT&T]]>与AT&T相同。任何具有AT&T的XML都将在客户机中显示为AT&T,因为这仅仅是转义&的一种方式。强制不对&进行转义会使生成的XML无效。如果超文本标记语言是你的输出,那么在某些情况下,这种转义是必需的(即在script元素中)。
可以在XSLT 1.0中使用的解决方法如下所示。假设您的入口点是从根节点开始的位置:
<xsl:template match="/">
<!-- your code here -->
</xsl:template>将其替换为:
<xsl:template match="/">
<xsl:variable name="pre-process">
<!-- your code here -->
<xsl:variable>
<xsl:apply-templates select="exslt:node-set($pre-process)" mode="escape"/>
</xsl:template>
<xsl:template match="@* | *" mode="escape">
<xsl:copy>
<xsl:apply-templates select="node()" mode="escape"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()" mode="escape">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>上面的代码只是简单地重新处理所有内容,并具体处理要转义的文本节点(转义时唯一重要的节点)。代码取决于扩展函数exslt:node-set的可用性,但几乎每个XSLT1.0处理程序都支持它。
以下是对链接中提供的代码的一些注释:
这没有任何效果。
排序类型“
”>
这没有任何效果(对属性进行排序是没有意义的,因为属性总是以处理器喜欢的任何顺序输出)。
这是非法的,如果你仍然拥有它,你将不能运行你的样式表。
发布于 2015-09-02 16:40:11
不清楚为什么要禁用输出转义。如果生成的是XML或HTML,则需要对与号进行转义才能使XML或HTML有效。如果要生成其他内容(文本),则应使用文本输出方法,而不是XML或HTML输出方法。也许你所需要的就是<xsl:output method="text"/>
如果初学者在90%的时间里使用disable-output-escaping,那是因为他们没有找到正确的方法来达到他们想要的效果。不幸的是,您并没有真正解释您试图实现的目标(例如,您的转换的输出是什么?)。
https://stackoverflow.com/questions/32345602
复制相似问题