XSLT 如何在另一个兄弟之前移动兄弟

XSLT How to move sibling before another

我正在尝试更改 XML:

中元素的顺序

<currentElementId>4</currentElementId>

<level value="1">
    <level value="2">
        Some text
    </level>
    <level value="3">
        Some text
    </level>
    <level value="4">
        Some text
    </level>
</level>

结果应该是:

<currentElementId>4</currentElementId>

<level value="1">
    <level value="2">
        Some text
    </level>
    <level value="4">
        Some text
    </level>
    <level value="3">
        Some text
    </level>

</level>

在 currentElementId 中指定的 value="4" 的元素在 value="3" 的元素之前移动,要移动的目标元素始终在 currentElementId 中指定。

此致。

首先,您必须有一个格式正确的输入,只有一个根元素,例如:

<root>
    <currentElementId>c</currentElementId>
    <level value="1">
        <level value="a">Alpha</level>
        <level value="b">Bravo</level>
        <level value="c">Charlie</level>
        <level value="d">Delta</level>
    </level>
</root>

那么您可以申请:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="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="level[following-sibling::level[1]/@value=/root/currentElementId]">
    <xsl:copy-of select="following-sibling::level[1]"/>
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="level[@value=/root/currentElementId]"/>

</xsl:stylesheet>

获得结果:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <currentElementId>c</currentElementId>
   <level value="1">
      <level value="a">Alpha</level>
      <level value="c">Charlie</level>
      <level value="b">Bravo</level>
      <level value="d">Delta</level>
   </level>
</root>

请注意,我们在此假设所选元素不是第一个元素。