我有一个标签
<name>Sample " '</name>
在XSL中我将此标记转换为:
<xsl:variable name="productName" select="substring($elemXPath/name,1,50)"/>
<someTag someAttr="{$productName}"/>
当我运行XSLT时,输出为:
<someTag someAttr="Sample " '"/>
但我想得到
<someTag someAttr="Sample " '"/>
代替。我不想将输入数据的每次使用都包含在单独的转义模板中,因为我的xslt中有这么多地方的浪费。
我尝试在输入文件中编码撇号,但是当我放入
时<name>Sample '</name>
到输入文件然后我得到了
<someTag someAttr="Sample &apos;"/>
而不是
<someTag someAttr="Sample '"/>
我的问题是如何强制/配置XSLT来编码撇号,就像引号一样?
答案 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=""" string="&quot;"/>
<xsl:output-character character="'" string="&apos;"/>
</xsl:character-map>
<xsl:template match="/">
<someTag someAttr="Sample " '" />
</xsl:template>
</xsl:stylesheet>
这会产生想要的结果:
<someTag someAttr="Sample " '"/>
答案 1 :(得分:1)
通常,您不应该关心XSLT处理器选择的数据的两个等效序列中的哪一个。任何理智的消费者都会以同样的方式对待他们;如果不是,你应该修复消费者。
但是,出于实用的原因,XSLT 1.0提供了disable-output-escaping,XSLT 2.0提供了字符映射,因此如果你真的必须,你可以调整这个级别的输出。