0

我有类似于以下的 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 原样。是否可以?谢谢

4

2 回答 2

0

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

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

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

于 2013-02-27T11:54:50.627 回答
0

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

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

于 2013-02-27T16:41:47.930 回答