将子元素移动到父节点的底部?

时间:2018-03-19 19:53:31

标签: xml xslt xslt-1.0

所以我对XSL有疑问:
我有一堆元素,包含一个子元素,可以通过某个更新重命名和移动。我正在努力处理这种转变。以下示例将提供更好的主意。

之前:

<DGS>
  <DG>
   <FallbackGroup>
      <name>name</name>
      <timeout>20</timeout>
   </FallbackGroup>
   <CallRouting>
       <route>route</route>
   </CallRouting>
  </DG>
</DGS>

后:

<DGS>
  <DG>
   <CallRouting>
       <route>route</route>
   </CallRouting>
   <FallbackGroup>
      <name>name</name>
      <timeout>20</timeout>
   </FallbackGroup>
  </DG>
</DGS>

我必须为这些单独的<DG>元素执行此操作。我在这里看了很多类似的问题,但他们的解决方案都没有做我想让他们做的事情。所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

要更改<DG>元素的子元素的顺序,您可以将身份模板与以下内容结合使用:

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

<!-- reorders the DG element --> 
<xsl:template match="DG">
  <xsl:copy>                                 <!-- copies DG element -->
    <xsl:copy-of select="CallRouting" />     <!-- copies CallRouting element -->
    <xsl:copy-of select="FallbackGroup" />   <!-- copies FallbackGroup element -->
  </xsl:copy>
  </xsl:template>

输出为:

<DGS>
    <DG>
        <CallRouting>
            <route>route</route>
        </CallRouting>
        <FallbackGroup>
            <name>name</name>
            <timeout>20</timeout>
        </FallbackGroup>
    </DG>
</DGS>

答案 1 :(得分:0)

如果您的源DG元素具有超过2个子元素并且您想要 将FallbackGroup移到最后,然后尝试更一般的解决方案。

  • 匹配DG的模板应该从复制所有子项开始 FallbackGroup
  • 然后它应该复制(唯一剩下的)FallbackGroup

所以整个脚本可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="DG">
    <xsl:copy>
      <xsl:copy-of select="* except FallbackGroup"/>
      <xsl:copy-of select="FallbackGroup"/>
    </xsl:copy>
  </xsl:template>

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