gpt4 book ai didi

xml - 如何使用 XSLT 对 XML 的子元素进行排序

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:26 24 4
gpt4 key购买 nike

我有一个输入 XML 文件,我需要将其 1:1 复制到输出,除了一个包含需要排序的子项的子元素。

<?xml version="1.0"?>
<top>
<elementA />
<elementB />
<contents>
<contentitem>
<id>3</id>
<moretags1 />
<moretags2 />
</contentitem>
<contentitem>
<id>2</id>
<moretags1 />
<moretags2 />
</contentitem>
<contentitem>
<id>1</id>
<moretags1 />
<moretags2 />
</contentitem>
</contents>
</top>

我想要一个 XSL 转换,它将“contentitem”元素按顺序排列,并按其“id”元素排序。所有其他标签,包括嵌套标签,都必须逐字复制。我已经尝试过使用 xsl:copy,但是要么我得到了双重内容,要么结果丢失了一些东西。

最佳答案

Mark Gravell 的解决方案几乎是正确的 -- 有一个小问题会创建两个嵌套的 <contents>元素。 请注意所有提供答案的人:请测试您的解决方案!

这是一个正确的解决方案。这种转变:

<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="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- -->
<xsl:template match="contents">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="contentitem">
<xsl:sort select="id" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

应用于最初提供的 XML 文档时:

<top>
<elementA />
<elementB />
<contents>
<contentitem>
<id>3</id>
<moretags1 />
<moretags2 />
</contentitem>
<contentitem>
<id>2</id>
<moretags1 />
<moretags2 />
</contentitem>
<contentitem>
<id>1</id>
<moretags1 />
<moretags2 />
</contentitem>
</contents>
</top>

产生想要的、正确的结果:

<top>
<elementA/>
<elementB/>
<contents>
<contentitem>
<id>1</id>
<moretags1/>
<moretags2/>
</contentitem>
<contentitem>
<id>2</id>
<moretags1/>
<moretags2/>
</contentitem>
<contentitem>
<id>3</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</top>

请注意以下事项:

  1. identity rule的使用 复制所有节点而不做任何更改。

  2. 如何使用与 contents 匹配的特定模板覆盖身份模板元素

  3. <xsl:sort> 的使用指示以特定顺序呈现应用模板的结果,该顺序可能与选择进行处理的节点的文档顺序不同。

关于xml - 如何使用 XSLT 对 XML 的子元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/572854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com