1

在输入 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 对撇号进行编码,就像对引号一样?

4

2 回答 2

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;"/>
于 2011-10-18T13:11:13.557 回答
1

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

但是,出于实用的原因,XSLT 1.0 提供了禁用输出转义,而 XSLT 2.0 提供了字符映射,因此如果您确实需要,您可以在此级别调整输出。

于 2011-10-18T13:22:21.893 回答