我有类似于以下的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
答案 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部分边界来携带信息的人都应该被拍摄。