使用XSLT将元素向下移动

时间:2016-01-18 15:50:30

标签: xml xslt

我有一个需要重新排列的XML:

<?xml version="1.0" encoding="UTF-8"?>

<application id="app_name">
  <display-name>app_name</display-name>

  <module id="epi-ejb-module">
    <ejb>appJar.jar</ejb>
  </module>

  <module>
    <web>
      <web-uri>awsi-client.war</web-uri>
      <context-root>/awsi-client</context-root>
    </web>
  </module>

  <module>
    <web>
      <web-uri>other_war.war</web-uri>
      <context-root>/some/path</context-root>
    </web>
  </module>

  ...

</application>

我需要将awsi-client.war模块移动到最后一个位置,同时保留文档的其余部分。我的主要困难是区分同名的元素。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这应该适合你:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

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

    <xsl:template match="module[web/web-uri = 'awsi-client.war']" />

    <xsl:template match="module[last()]">
        <xsl:copy-of select="."/>
        <xsl:copy-of select="../module[web/web-uri = 'awsi-client.war']"/>        
    </xsl:template>

</xsl:stylesheet>

它使用标识模板,(1)省略在其原始位置输出包含awsi-client.war的模块元素,以及(2)在最后一个模块元素上匹配,复制它,然后输出包含{{的模块1}} web-uri。