我有一些包含字符十六进制代码的 XML,例如:
<char hex="AB"/>
现在我想将 XSLT 转换为在浏览器中显示:
<xsl:value-of select="concat('&#x', /char/@hex, ';', '')"/>
但是,浏览器中的输出&#xAB;
与我预期«
的不同,因此浏览器不显示该代码的字符(应该是«
),而只显示文字字符串«
我怎样才能让 XSL 不逃避 & 符号?
output method
如果您将 设置为 ,则可以完成此操作text
。
这种转变:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="char">
<xsl:value-of select="concat('&#x', /char/@hex, ';', '')"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<char hex="AB"/>
产生想要的结果:
«
当然,使用text
输出方法需要生成开始和结束标记的单个字符(<xsl:copy>
,<xsl:copy-of>
和<xsl:element>
文字结果元素在此输出方法中不会生成任何标记),但是有一些耐心,一切皆有可能。
也可以使用 DOE(禁用输出转义),但这个“特性”在 XSLT 规范中不是强制性的。并且一些 XSLT 处理器(包括,我认为 FF 使用的那个)没有实现 DOE。
可能最好的解决方案(不使用method="text"
)如下:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my"
>
<xsl:output omit-xml-declaration="yes" indent="yes" encoding="us-ascii"/>
<my:hex>
<code start="8">€‚ƒ„…†‡ˆ‰Š‹ŒŽ</code>
<code start="9">‘’“”•–—˜™š›œžŸ</code>
<code start="A"> ¡¢£¤¥¦§¨©ª«¬­®¯</code>
<code start="B">°±²³´µ¶·¸¹º»¼½¾¿</code>
<code start="C">ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ</code>
<code start="D">ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß</code>
<code start="E">àáâãäåæçèéêëìíîï</code>
<code start="F">ðñòóôõö÷øùúûüýþÿ</code>
</my:hex>
<xsl:variable name="vHex" select="document('')/*/my:hex/*"/>
<xsl:template match="char">
<xsl:variable name="vchar1" select="substring(@hex,1,1)"/>
<xsl:variable name="vchar2" select="substring(@hex,2,1)"/>
<xsl:variable name="voffset">
<xsl:choose>
<xsl:when test="number($vchar2)">
<xsl:value-of select="$vchar2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count($vHex[@start = $vchar2]/preceding-sibling::*)+9"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="substring($vHex[@start=$vchar1], $voffset, 1)"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<char hex="AB"/>
产生了想要的结果:
«
这假定hex
属性的值是 x80 到 xFF 范围内的十六进制。如果需要有更宽范围的值,例如x00到XFF,则code
需要相应地向元素添加更多my:hex
元素
我认为您的问题不仅仅是转义,但是属性disable-output-escaping
呢?
<xsl:value-of disable-output-escaping="yes" select="concat('&#x', /char/@hex, ';', '')"/>