特殊字符和®在XSLT中不能同时工作

时间:2014-08-06 11:30:04

标签: xml xslt-2.0

我正在使用xslt 2.0并生成xml 1.0。

当我在xslt中使用disable-output-escaping="yes"时看起来像这样:

<Desc><xsl:value-of select="$Desciption" disable-output-escaping="yes"/></Desc>

但有时候&reg介于$ Description变量值之间。因此它会产生问题,我想同时处理disable-output-escaping&reg两种情况。

我使用替换翻译功能,但无效

因此我使用此代码来处理这些情况。

 <xsl:if test="contains($Description, '&amp;reg;')">

        <xsl:variable name="before" select="substring-before($Description, '&amp;reg;')"/>
        <xsl:variable name="after" select="substring-after($Description, '&amp;reg;')"/>
        <xsl:variable name="final" select="concat($before,'&#174;')"/>
        <xsl:variable name="finalDescription" select="concat($final,$after)"/>

     <Desc><xsl:value-of select="$finalDescription" disable-output-escaping="yes" /></Desc>

</xsl:if>

但是当我使用这个disable-output-escaping =“yes”时它不起作用。否则工作正常。

请给我建议如何同时处理这两种情况。

的问候, Jatin

1 个答案:

答案 0 :(得分:1)

您正在尝试使用命名的XML实体&reg;(通常为®),就好像它是文本一样。然后你好像是想要输出&reg;,但这不是你的代码所做的。您(可能)输出XML并且disable-output-escaping仅适用于实际需要转义然后禁用的内容。 &#x174;不需要转义,因此不会转义。

fn:replace这样的字符串函数对disable-output-escaping没有任何影响,它们操纵字符串,因为它们在内存中是已知的,它们不会操纵它们被序列化的方式(这就是{{1}确实)。

您正在使用XSLT 2.0。你根本不应该使用disable-output-escaping。它在XSLT 2.0中已被弃用,而不是disable-output-escaping,这更灵活。只需将角色放在你想逃脱的地方,当你需要它逃脱时,使用角色地图(即在xsl:character-mapxsl:output上,你甚至可以动态地这样做),如果你不这样做需要它逃脱,然后不要使用是。

我不确定为什么你有时会想要它逃脱,有时候不会。序列化XML时,您永远不会看到xsl-result-document,您将看到数字引用或实际字符(取决于所选的编码)。如果你想在一种情况下看到&reg;而在另一种情况看到&reg;,后者只是一个文字字符串,前者可以再次用字符映射创建。

&amp;reg;