我正在使用xslt 2.0并生成xml 1.0。
当我在xslt中使用disable-output-escaping="yes"
时看起来像这样:
<Desc><xsl:value-of select="$Desciption" disable-output-escaping="yes"/></Desc>
但有时候®
介于$ Description变量值之间。因此它会产生问题,我想同时处理disable-output-escaping
和®
两种情况。
我使用替换和翻译功能,但无效。
因此我使用此代码来处理这些情况。
<xsl:if test="contains($Description, '&reg;')">
<xsl:variable name="before" select="substring-before($Description, '&reg;')"/>
<xsl:variable name="after" select="substring-after($Description, '&reg;')"/>
<xsl:variable name="final" select="concat($before,'®')"/>
<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
答案 0 :(得分:1)
您正在尝试使用命名的XML实体®
(通常为®),就好像它是文本一样。然后你好像是想要输出®
,但这不是你的代码所做的。您(可能)输出XML并且disable-output-escaping仅适用于实际需要转义然后禁用的内容。 Ŵ
不需要转义,因此不会转义。
像fn:replace
这样的字符串函数对disable-output-escaping
没有任何影响,它们操纵字符串,因为它们在内存中是已知的,它们不会操纵它们被序列化的方式(这就是{{1}确实)。
您正在使用XSLT 2.0。你根本不应该使用disable-output-escaping
。它在XSLT 2.0中已被弃用,而不是disable-output-escaping
,这更灵活。只需将角色放在你想逃脱的地方,当你需要它逃脱时,使用角色地图(即在xsl:character-map
或xsl:output
上,你甚至可以动态地这样做),如果你不这样做需要它逃脱,然后不要使用是。
我不确定为什么你有时会想要它逃脱,有时候不会。序列化XML时,您永远不会看到xsl-result-document
,您将看到数字引用或实际字符(取决于所选的编码)。如果你想在一种情况下看到®
而在另一种情况看到®
,后者只是一个文字字符串,前者可以再次用字符映射创建。
&reg;