我有以下类似的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边界来携带信息的人都应该被枪毙。