如何在XSLT 2.0中重新排序包括子节点在内的节点

时间:2018-02-12 16:10:05

标签: xml xslt-2.0

我一直在尝试根据结构更改节点的顺序。

让我们假设我们有一个示例xml

<?xml version="1.0" encoding="UTF-8"?>
<ParentNode>
  <example>value</example>
  <example>value</example>
  <node>
     <one>1</one>
     <two>1</two>
     <three>1</three>
     <four>1</four>
  </node>
  <node>
     <one>2</one>
     <two>2</two>
     <three>2</three>
     <four>2</four>
  </node>
</ParentNode>

这个<node>部分也在重复其他值,这是整个结构的简化版本。

我想要的是:我想更改值为2的<node>的顺序,<node>的值为1

 <?xml version="1.0" encoding="UTF-8"?>
<ParentNode>
  <example>value</example>
  <example>value</example>
  <node>
     <one>2</one>
     <two>2</two>
     <three>2</three>
     <four>2</four>
  </node>
  <node>
     <one>1</one>
     <two>1</two>
     <three>1</three>
     <four>1</four>
  </node>
</ParentNode>

让我们假设,<three>是我们重新排序节点的关键值,所以我想说<xsl:when test="value=2">将整数放在第一个节点之前。

如何在XSLT 2.0中编写它?

编辑:我通过更改模板中的变量找到了解决方案,所以我做的是,将值放在&#34; 2&#34;节点进入&#34; 1&#34;而且,这是一个手动解决方案,但最后,它的工作原理。谢谢你的想法

2 个答案:

答案 0 :(得分:2)

写两个模板

Framework not found AlamoFire

加上身份转换并交换两个元素(http://xsltfiddle.liberty-development.net/3Nqn5Yd的XSLT 3版本,对于XSLT 2,您必须拼出身份转换模板:

  <xsl:template match="node[three = 1]">
      <xsl:copy-of select="../node[three = 2]"/>
  </xsl:template>

  <xsl:template match="node[three = 2]">
      <xsl:copy-of select="../node[three = 1]"/>
  </xsl:template>

http://xsltransform.hikmatu.com/gWcDMek

答案 1 :(得分:1)

如果您的node值中有任何字面顺序,您可以使用xsl:sort函数对其进行重新排序:

<xsl:template match="/ParentNode">
  <xsl:copy>
    <xsl:copy-of select="example" />
    <xsl:for-each select="node">  
      <xsl:sort select="three" order="descending" />
      <xsl:copy>
        <xsl:copy-of select="node()|@*" />
      </xsl:copy>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

<强>输出:

<ParentNode>
    <example>value</example>
    <example>value</example>
    <node>
        <one>2</one>
        <two>2</two>
        <three>2</three>
        <four>2</four>
    </node>
    <node>
        <one>1</one>
        <two>1</two>
        <three>1</three>
        <four>1</four>
    </node>
</ParentNode>