XML转换排序并保留CDATA标记

时间:2013-02-27 11:36:25

标签: xml transformation cdata

我有类似于以下的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<domData CHECK_STATE="P">
  <K>
    <![CDATA[F]]>
  </K>
  <P>
    <![CDATA[F]]>
  </P
  <L>
    <![CDATA[F
    CC
    DD
    GEJ]]>
  </L>
  <D/>
  <E/>
  <A>TEST</A>
  <B>
  <![CDATA[<root><iA>DATA</iA><iB>DDDD</iB><</root>]]>
  </B>
</domData>

我有以下转型

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*">
                <xsl:sort select="name()"/>
            </xsl:apply-templates>

            <xsl:apply-templates select="node()">
                <xsl:sort select="name()">
                </xsl:sort>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

上面的转换会删除所有CDATA并转义内部xml实体。

我不能使用“cdata-section-elements”,因为数字元素很大,我也想对不同的XML文件使用相同的xslt。

我的问题是我需要保持CDATA标签和内部xml不变。 可能吗? THX

2 个答案:

答案 0 :(得分:0)

  

我不能使用“cdata-section-elements”,因为数字元素很大,我也想对不同的XML文件使用相同的xslt。

cdata-section-elements是制作XSLT输出CDATA部分的唯一标准方法。当然不可能像在输入文档中那样完全保留CDATA部分,因为有关哪些文本节点最初是CDATA部分以及哪些是纯文本节点的信息在XPath数据模型中是不可用的。但它不应该是必要的,因为CDATA部分只是一个语法糖,就任何XML处理器而言,它们完全等同于实体转义形式。

您可以使用特定于处理器的技巧,但这取决于您将使用的XSLT处理器。如果不这样做,您可能希望考虑非XSLT解决方案,使用DOM等对象模型,可以将其配置为保留原始CDATA结构。

答案 1 :(得分:0)

如果CDATA标签传达信息,首先将其替换为XSLT理解并保留在数据模型中的其他内容。您可以在XSLT处理的输入端使用SAX过滤器传递执行此操作,并且可以在输出端的类似过滤器传递中将元素转换回CDATA标记。<​​/ p>

但是,任何使用CDATA部分边界来携带信息的人都应该被拍摄。