XML转换排序和保存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"作为数字元素是巨大的,我想使用相同的xslt不同的XML文件以及

我的问题是,我需要保持CDATA标签和内部xml原样。这可能吗?Thx

我不能使用"cdata-section-elements"作为数字元素是巨大的,我想使用相同的xslt不同的XML文件以及

cdata-section-elements是生成XSLT输出CDATA节的唯一标准方法。当然,不可能完全保留输入文档中的CDATA节,因为关于哪些文本节点最初是CDATA节,哪些是纯文本节点的信息在XPath数据模型中根本不可用。但这并不是必需的,因为CDATA节只是语法上的糖,而且就任何XML处理器而言,它们完全等同于实体转义形式。

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

如果CDATA标记传递信息,首先用XSLT能够理解并保留在数据模型中的其他内容替换它们。您可以在XSLT处理的输入端使用SAX筛选传递来实现这一点,并且可以在输出端使用类似的筛选传递将元素转换回CDATA标记。

但是,任何使用CDATA section边界来携带信息的人都应该被枪毙。

最新更新