通过多次转换替换和维护字符实体

时间:2010-11-12 22:22:42

标签: xml xslt xslt-2.0

问题:我们有各种格式的字符实体(Ex:&&),我们需要将它们转换为标准的XML字符实体(&amp < > ' "然后通过几个单独的转换将它们保存为实体。

给出XML:

<rootelm>
 <testdata>&amp;apos; &amp;gt; &amp;lt; &amp;quot;</testdata>
</rootelm>

和(基于xsl:character-map to replace special characters)的样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <!-- COPY EVERYTHING -->
 <xsl:template match="node() | @*">
  <xsl:copy>
   <xsl:apply-templates select="@* | node()">
    <xsl:sort select="local-name()"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
 <xsl:variable name="quote">
  <xsl:text>&amp;quot;</xsl:text>
 </xsl:variable>
 <xsl:variable name="quote2">
  <xsl:value-of select="string('&quot;')"/>
 </xsl:variable>
 <xsl:template match="text()[contains(.,'&amp;lt;') or contains(.,'&amp;gt;') or contains(.,'&amp;quot;') or contains(.,'&amp;apos;')]">
  <xsl:value-of select='replace(
  replace(
   replace(
    replace(., "&amp;lt;", "&lt;"),
   "&amp;gt;",
   "&gt;"
   ),
  "&amp;apos;",
  "&apos;"
  ),
  $quote,
  $quote2
 )
    ' />
 </xsl:template>
</xsl:stylesheet>

如何将撇号和引号保留为实体(源系统期望/需要它)?

当前输出:

<rootelm> 
   <testdata>' &gt; &lt; "</testdata>
</rootelm>

1 个答案:

答案 0 :(得分:3)

使用Character Maps

  

[定义:角色地图允许一个   特定字符出现在文本中   或最终结果中的属性节点   树被指定的替换   期间的字符串   序列化。]

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