XSL转换和特殊的XML实体转义

时间:2009-12-16 14:56:12

标签: xml xslt entity escaping

我有一个用XSL转换的XML文件。有些元素必须更改,有些必须保留原样 - 特别是带有实体的文字&amp; quot; &amp; amp; &amp; apos ; &amp; lt; &amp; gt; 应保留原样,在我的情况下&amp; quot; 并且&amp; << / strong>相应地更改为'

测试XML:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <element>
        &quot;
        &amp;
        &apos;
        &lt;
        &gt;
    </element>
</root>

转换文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="no" />
    <xsl:template match="element">
        <xsl:copy>
            <xsl:value-of disable-output-escaping="no" select="." />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
    <element>
        "
        &amp;
        '
        &lt;
        &gt;
    </element>

期望的结果:

<?xml version="1.0" encoding="UTF-8"?>
    <element>
        &quot;
        &amp;
        &apos;
        &lt;
        &gt;
    </element>

我有两个问题:

  • 为什么有些实体会被改造而其他实体没有转变?
  • 我怎样才能得到理想的结果?

2 个答案:

答案 0 :(得分:3)

原因是,<>&始终必须以XML格式转义。它们在XML中具有特殊含义,因此如果它们是数据的一部分(而不是标记),则必须对它们进行特殊处理。

另外两个,'"可以转义,它们的实体名称是XML已知的(主要是为了启用正确运行的属性值,如下所示:

<xml ackbar="He said, &quot;It's a trap!&quot;" />
<xml ackbar='He said, "It&apos;s a trap!"' />

在他们逃避并非绝对必要的所有地方,它们都可以按字面意思发生。

结果信息集(例如以DOM的形式)将完全相同,您不应过多关注它们是字面上出现还是作为XML文件中的实体出现。

事实上,您的所有数据都可以以转义形式出现(编号实体,如&#10;)而不更改实际文档 - 只有序列化表示不同。

只要您使用XML感知工具(例如DOM解析器),您就永远不会注意到差异。推论:如果您不使用支持XML的工具(例如正则表达式或字符串操作),则应立即停止。 ; - )

答案 1 :(得分:0)

你总是可以逃脱原来的&符号,实质上它看起来像

&amp;quot;