2010-06-27 63 views
2

我有一些包含字符十六进制代码的XML,例如:它是这样的:在xslt中插入html实体

<char hex="AB"/> 

现在我想XSLT转换,在浏览器中显示:

<xsl:value-of select="concat('&amp;#x', /char/@hex, ';', '')"/> 

然而,在浏览器中输出&amp;#xAB;并没有像我想象的&#xAB; 这样浏览器就不显示该代码的字符(这将是«),但只有文字字符串&#xAB;

我怎样才能让XSL不会跳过&符号?

+0

您可以粘贴XSL转换的结果吗?我很好奇这是怎么发生的。 – janmoesen 2010-06-27 10:37:01

+0

好问题(+1)。看到我的答案几个完整的解决方案。 – 2010-06-27 15:55:02

回答

0

我觉得你的问题不仅仅是逃避,而是如何处理the disable-output-escaping attribute

<xsl:value-of disable-output-escaping="yes" select="concat('&amp;#x', /char/@hex, ';', '')"/> 
+0

我已经尝试过,但它不会以任何方式影响输出。我在Firefox中测试,顺便说一句。 – tomhh 2010-06-27 12:44:40

1

这可如果你设置了output methodtext来完成。

该转化

<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('&amp;#x', /char/@hex, ';', '')"/> 
</xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档施加:

<char hex="AB"/> 

产生想要的结果

&#xAB; 

当然,与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">&#x80;&#x81;&#x82;&#x83;&#x84;&#x85;&#x86;&#x87;&#x88;&#x89;&#x8A;&#x8B;&#x8C;&#x8D;&#x8E;&#x8F;</code> 
    <code start="9">&#x90;&#x91;&#x92;&#x93;&#x94;&#x95;&#x96;&#x97;&#x98;&#x99;&#x9A;&#x9B;&#x9C;&#x9D;&#x9E;&#x9F;</code> 
    <code start="A">&#xA0;&#xA1;&#xA2;&#xA3;&#xA4;&#xA5;&#xA6;&#xA7;&#xA8;&#xA9;&#xAA;&#xAB;&#xAC;&#xAD;&#xAE;&#xAF;</code> 
    <code start="B">&#xB0;&#xB1;&#xB2;&#xB3;&#xB4;&#xB5;&#xB6;&#xB7;&#xB8;&#xB9;&#xBA;&#xBB;&#xBC;&#xBD;&#xBE;&#xBF;</code> 
    <code start="C">&#xC0;&#xC1;&#xC2;&#xC3;&#xC4;&#xC5;&#xC6;&#xC7;&#xC8;&#xC9;&#xCA;&#xCB;&#xCC;&#xCD;&#xCE;&#xCF;</code> 
    <code start="D">&#xD0;&#xD1;&#xD2;&#xD3;&#xD4;&#xD5;&#xD6;&#xD7;&#xD8;&#xD9;&#xDA;&#xDB;&#xDC;&#xDD;&#xDE;&#xDF;</code> 
    <code start="E">&#xE0;&#xE1;&#xE2;&#xE3;&#xE4;&#xE5;&#xE6;&#xE7;&#xE8;&#xE9;&#xEA;&#xEB;&#xEC;&#xED;&#xEE;&#xEF;</code> 
    <code start="F">&#xF0;&#xF1;&#xF2;&#xF3;&#xF4;&#xF5;&#xF6;&#xF7;&#xF8;&#xF9;&#xFA;&#xFB;&#xFC;&#xFD;&#xFE;&#xFF;</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"/> 

有用结果生产

&#171; 

这假设hex属性的值是十六进制的,范围为x80到xFF。如果需要更大范围内的值(例如x00到XFF),则需要将更多code元素相应地添加到my:hex元素中