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

时间:2015-01-12 22:09:15

标签: xslt-1.0

我正在尝试更改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中指定。

最好的问候。

1 个答案:

答案 0 :(得分:0)

首先,您必须具有单个根元素的格式良好的输入,例如:

<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>

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