XPath 1.0:将节点集中的第一个项目移动到最后位置

时间:2018-04-24 12:20:03

标签: xpath xslt-1.0

给定XML文档

<items>
 <item><key></key><value>empty</value></item>
 <item><key>A</key><value>foo</value></item>
 <item><key>C</key><value>data</value></item>
 <item><key>B</key><value>bar</value></item>
</items>

给定/ items / item节点集,我希望将第一个项目移动到最后一个位置,同时将所有其他项目保持在同一位置。

不可靠的方法:

  • | union运营商保持文件顺序。
  • <xsl:sort>我只想移动一个项目,而不是整个项目列表。

预期结果:

<items>
 <item><key>A</key><value>foo</value></item>
 <item><key>C</key><value>data</value></item>
 <item><key>B</key><value>bar</value></item>
 <item><key></key><value>empty</value></item>
</items>

注意:要移动的项目可以通过第一个位置或空键识别(如果这有用)。

2 个答案:

答案 0 :(得分:2)

一种方法是将以下模板与身份模板结合使用:

&#xA;&#xA;
 &lt; xsl:template match =“项[1]“&GT; &lt;! - 匹配第一个项目元素 - &gt;&#xA; &lt; xsl:copy-of select =“following-sibling :: *”/&gt; &lt;! - 复制除第一个元素以外的所有元素 - &gt;&#xA; &lt; xsl:copy-of select =“。”/&gt; &lt ;!  - 复制当前/第一个元素 - &gt;&#xA;&lt; / xsl:template&gt;&#xA;  
&#xA;&#xA;

< strong>输出为:

&#xA;&#xA;
 &lt; item&gt;&#xA; &LT;键&gt;将&LT; /密钥GT;&#XA; &LT;值GT; FOO&LT; /值GT;&#XA;&LT; /项目&GT;&#XA;&LT;项目&GT;&#XA; &LT;密钥GT;℃下/密钥GT;&#XA; &LT;值GT;数据&LT; /值GT;&#XA;&LT; /项目&GT;&#XA;&LT;项目&GT;&#XA; &LT;键&GT; B&LT; /密钥GT;&#XA; &LT;值GT;巴≤; /值GT;&#XA;&LT; /项目&GT;&#XA;&LT;项目&GT;&#XA; &LT;键/&GT;&#XA; &lt; value&gt; empty&lt; / value&gt;&#xA;&lt; / item&gt;&#xA;  
&#xA;&#xA;

添加身份模板使用 items 元素围绕它,以提供完整的,期望的输出。

&#xA;

答案 1 :(得分:2)

这可能会对你有帮助。

<!--  Identity template  -->  
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="items">
  <xsl:copy>
    <!-- Output attributes, if any. -->
    <xsl:apply-templates select="@*"/>
    <!-- Out item(s) that are not first. -->
    <xsl:apply-templates select="item[position() != 1]"/>
    <!-- Output the first item. -->
    <xsl:apply-templates select="item[position() = 1]"/>
  </xsl:copy>
</xsl:template>