如何添加disable-output-escaping =" yes"到我的xsl文件?

时间:2015-09-02 05:57:49

标签: html google-chrome xslt xslt-1.0

我有以下xsl文档:http://jsfiddle.net/Abadi/92ndrnut/2/。 我需要添加:disable-output-escaping =" yes"。 因为它适用于:

<CARRIERNAME>
    <![CDATA[AT&T]]>
</CARRIERNAME>.

正在制作:AT&amp;T

应用的模板是:

<xsl:value-of select="CARRIERNAME" />

当我将其更新为:

<xsl:value-of select="CARRIERNAME" disable-output-escaping="yes" />

它起作用了,输出是:AT&T

我的问题是如何添加disable-output-escaping =&#34; yes&#34;到xsl文档,以便它将应用于所有模板。

更改应在链接中提供的xsl documnet中进行。 或者,如果可能有不同的方法。 我是xslt的新手,非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

  

我的问题是如何添加disable-output-escaping =&#34; yes&#34;到xsl文档,以便它将应用于所有模板。

这是XSLT 2.0的一项功能,其中disable-output-escaping被视为已弃用并由xsl:character-maps取代。这些字符映射可以应用于整个输出。

请注意,<![CDATA[AT&T]]>AT&amp;T相同。任何具有AT&amp;T的XML都将作为AT&T显示在客户端中,因为它只是一种转义&的方法。强制&不被转义会导致生成的XML无效的XML。如果HTML是你的输出,那么在某些情况下需要这种转义(即在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的可用性,但几乎每个XSLT 1.0处理器都支持它。

对链接中提供的代码进行了一些评论:

<xsl:if test="following-sibling::*">
    <xsl:text></xsl:text>
</xsl:if>

这没有效果。

<xsl:sort>
   <xsl:attribute name="select"><xsl:value-of select="meta_data//bindto"/></xsl:attribute>
   <xsl:attribute name="data-type"><xsl:value-of select="meta_data//sortby_type"/></xsl:attribute>
   <xsl:attribute name="order"><xsl:value-of select="meta_data//direction"/></xsl:attribute>
 </xsl:sort>

这没有任何效果(排序属性没有意义,因为属性总是以处理器首选的任何顺序输出。)

<xsl:text><xsl:value-of select="display_precision"/></xsl:text>

这是非法的,如果你仍然有这个,你将无法运行你的样式表。

答案 1 :(得分:0)

不清楚为什么要禁用输出转义。如果要生成XML或HTML,则需要对&符号进行转义,以使XML或HTML有效。如果要生成其他内容(文本),则应使用文本输出方法而不是XML或HTML输出方法。也许你需要的只是<xsl:output method="text"/>

如果初学者使用disable-output-escaping,90%的时间是因为他们没有找到正确的方法来达到他们想要的效果。不幸的是,虽然你还没有真正解释你想要实现的目标(例如,转换的输出是什么?)。