使用 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
元素,<xsl:template match="uuids">
将没有任何意义。
至于当前示例 cdata-section-elements="ae:value"
将修复 <value><![CDATA[AMNT Get test ]]></value>
元素,但您也有 a:value
在其中您有不同的前缀但相同的命名空间我不认为 XSLT 输出属性将允许您区分他们,如果这是你想要的。
【讨论】:
我没有包含 uuid。因为它的文件很大,而且它们按预期工作以上是关于使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板的主要内容,如果未能解决你的问题,请参考以下文章