使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板

Posted

技术标签:

【中文标题】使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板【英文标题】:xslt template to sort uuid's in xml with CDATA elements 【发布时间】:2021-08-13 01:47:04 【问题描述】:

我有一个 xslt 模板,用于对同一文件中的 uuid 进行排序。

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ae="http://www.test.com/ae/types/2009">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="ae:uuid ae:timeZoneId ae:stringId ae:name" standalone="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="uuids">
    <xsl:copy>
        <xsl:apply-templates select="uuid">
            <xsl:sort select="."/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

这是我要解析的 xml 文件,这是大型 xml 文件,我正在复制带有命名空间的 xml 文件的根目录以及使用 CDATA 修改的元素。

【问题讨论】:

如果您需要有关特定代码的帮助,您将需要显示任何相关的命名空间声明。没有命名空间声明但一些 XSLT 代码使用前缀(如 cdata-section-elements="ae:uuid ae:timeZoneId ae:stringId ae:name")的 XML 示例不允许我们判断和修复特定代码。一般来说,XSLT 不能保留 CDATA 部分,它的处理模型适用于具有不区分文本节点和 CDATA 部分的文本节点的树表示。对于结果的序列化,您可以像以前一样声明所需的 CDATA 部分元素。 您的示例 XML 未显示应用于内容的任何命名空间。这是来自较大文件的 sn-p 吗?您需要确保包含名称空间,否则在指定要使用 CDATA 序列化的元素的名称时,样式表将无法按预期工作。这和***.com/q/67639594/14419基本上是同一个问题 感谢您的回复。我刚刚更新了这个问题。可以请你们检查一下吗? @MadsHansen 是的,我只为特定问题打开了新的。您发布的上一个问题有多个问题,我几乎没有解决。 您编辑的输入样本似乎没有 CDATA 部分。 【参考方案1】:

如果输入没有uuids 元素,&lt;xsl:template match="uuids"&gt; 将没有任何意义。

至于当前示例 cdata-section-elements="ae:value" 将修复 &lt;value&gt;&lt;![CDATA[AMNT Get test ]]&gt;&lt;/value&gt; 元素,但您也有 a:value 在其中您有不同的前缀但相同的命名空间我不认为 XSLT 输出属性将允许您区分他们,如果这是你想要的。

【讨论】:

我没有包含 uuid。因为它的文件很大,而且它们按预期工作

以上是关于使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板的主要内容,如果未能解决你的问题,请参考以下文章

雷林鹏分享: XML CDATA

XML CDATA

为啥我在使用表情符号获取 cdata 元素时在 xml 标记中获取多个 cdata

XMl

xml元素类型PCDATA和CDATA的区别(DTD中)

Mybatis中的CDATA标签