我一直在尝试根据结构更改节点的顺序。
让我们假设我们有一个示例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;而且,这是一个手动解决方案,但最后,它的工作原理。谢谢你的想法答案 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>
答案 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>