gpt4 book ai didi

xslt - 颠倒 child 的顺序

转载 作者:行者123 更新时间:2023-12-04 06:28:00 27 4
gpt4 key购买 nike

我想使用模板来反转 XML 的不同序列;
例如 :

<book title="Definitive XML Schema">
<author first="Priscilla" />
<chapter title="[I] ">
<section title="[I.1]" />
<section title="[I.2]">
<section title="[I.2.1]" />
<section title="[I.2.2]" />
</section>
<section title="[I.3] ">
<section title="[I.3.1]" />
</section>
</chapter>
<chapter title="[II]">
<section title="[II.1]" />
<section title="[II.2]">
<section title="[II.2.1]" />
<section title="[II.2.2]" />
</section>
</chapter>
</book>

我想得到这样的输出:这是我的 xsl。
<?xml version="1.0" encoding="UTF-8"?>
<book title="Definitive XML Schema">
<author first="Priscilla"/>
<chapter title="[I]">
<section title="[I.3]">
<section title="[I.3.1]"/>
</section>
<section title="[I.2]">
<section title="[I.2.2]"/>
<section title="[I.2.1]"/>
</section>
<section title="[I.1]"/>
</chapter>
<chapter title="[II]">
<section title="[II.2]">
<section title="[II.2.2]"/>
<section title="[II.2.1]"/>
</section>
<section title="[II.1]"/>
</chapter>
</book>

是的,章节颠倒了,但章节没有颠倒。

我尝试使用两个模板来解决它,但它无法工作..
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent ="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="book">
<xsl:copy>
<xsl:sequence select="@title"/>
<xsl:sequence select="author"/>
<xsl:apply-templates select="chapter">
<xsl:with-param name="seq" select="section"/>

</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match ="chapter|section" as="element()">
<xsl:param name="seq" as="element(section)*"/>
<xsl:copy>
<xsl:sequence select="@title"/>
<xsl:if test="not(empty($seq))">
<xsl:apply-templates select="chapter">
<xsl:with-param name="seq" select="$seq[position()>1]"/>
</xsl:apply-templates>
<xsl:apply-templates select="$seq[1]"/>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:transform>

最佳答案

这是一个更简单的 XSLT 1.0(和 2.0)解决方案 :

<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="*[section]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<xsl:sort select="position()"
data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时 :
<book title="Definitive XML Schema">
<author first="Priscilla" />
<chapter title="[I] ">
<section title="[I.1]" />
<section title="[I.2]">
<section title="[I.2.1]" />
<section title="[I.2.2]" />
</section>
<section title="[I.3] ">
<section title="[I.3.1]" />
</section>
</chapter>
<chapter title="[II]">
<section title="[II.1]" />
<section title="[II.2]">
<section title="[II.2.1]" />
<section title="[II.2.2]" />
</section>
</chapter>
</book>

产生想要的、正确的结果(section 元素的所有序列都颠倒了) :
<book title="Definitive XML Schema">
<author first="Priscilla"/>
<chapter title="[I] ">
<section title="[I.3] ">
<section title="[I.3.1]"/>
</section>
<section title="[I.2]">
<section title="[I.2.2]"/>
<section title="[I.2.1]"/>
</section>
<section title="[I.1]"/>
</chapter>
<chapter title="[II]">
<section title="[II.2]">
<section title="[II.2.2]"/>
<section title="[II.2.1]"/>
</section>
<section title="[II.1]"/>
</chapter>
</book>

关于xslt - 颠倒 child 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5799531/

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