这可如果你设置了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
元素中
您可以粘贴XSL转换的结果吗?我很好奇这是怎么发生的。 – janmoesen 2010-06-27 10:37:01
好问题(+1)。看到我的答案几个完整的解决方案。 – 2010-06-27 15:55:02