2013-02-27 44 views
0

我有XML文件类似于以下XML转换排序,并保持CDATA标签

<?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

回答

0

我不能用“CDATA段元素”的元素数量是巨大的,我想用不同的XML文件相同的XSLT为好。

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

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

0

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

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