如何强制XSLT像对引号一样对撇号进行编码

时间:2011-10-18 09:00:00

标签: xslt escaping apostrophe

输入XML中的

我有一个标签

<name>Sample " '</name>

在XSL中我将此标记转换为:

<xsl:variable name="productName" select="substring($elemXPath/name,1,50)"/>
<someTag someAttr="{$productName}"/>

当我运行XSLT时,输出为:

<someTag someAttr="Sample &quot; '"/>

但我想得到

<someTag someAttr="Sample &quot; &apos;"/>

代替。我不想将输入数据的每次使用都包含在单独的转义模板中,因为我的xslt中有这么多地方的浪费。

我尝试在输入文件中编码撇号,但是当我放入

<name>Sample &apos;</name>

到输入文件然后我得到了

<someTag someAttr="Sample &amp;apos;"/>

而不是

<someTag someAttr="Sample &apos;"/>

我的问题是如何强制/配置XSLT来编码撇号,就像引号一样?

2 个答案:

答案 0 :(得分:2)

在XSLT 1.0中无法将序列化控制到此级别

在XSLT 2.0中使用<xsl:character-map>,如以下示例所示

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 version="2.0">
 <xsl:output method="xml" use-character-maps="myChars" omit-xml-declaration="yes"/>

 <xsl:character-map name="myChars">
  <xsl:output-character character="&quot;" string="&amp;quot;"/>
  <xsl:output-character character="&apos;" string="&amp;apos;"/>
 </xsl:character-map>

 <xsl:template match="/">
     <someTag someAttr="Sample &quot; &apos;"   />
 </xsl:template>
</xsl:stylesheet>

这会产生想要的结果

<someTag someAttr="Sample &quot; &apos;"/>

答案 1 :(得分:1)

通常,您不应该关心XSLT处理器选择的数据的两个等效序列中的哪一个。任何理智的消费者都会以同样的方式对待他们;如果不是,你应该修复消费者。

但是,出于实用的原因,XSLT 1.0提供了disable-output-escaping,XSLT 2.0提供了字符映射,因此如果你真的必须,你可以调整这个级别的输出。