使用xslt交换元素或子树的位置



我有一个XML:

<root>
<a>
<a1>field_name**1**</a1>
<a2>field_value**1**</a2>
</a>
<a>
<a1>field_name**2**</a1>
<a2>field_value**2**</a2>
</a>
<a>
<a1>field_name**3**</a1>
<a2>field_value**3**</a2>
</a>
<root>

我需要根据字段名替换元素的顺序,如下所示:

<root>
<a>
<a1>field_name**2**</a1>
<a2>field_value**2**</a2>
</a>
<a>
<a1>field_name**1**</a1>
<a2>field_value**1**</a2>
</a>
<a>
<a1>field_name**3**</a1>
<a2>field_value**3**</a2>
</a>
<root>

实际的XML有更多的键值对,因此完全重新创建文件的效率不高。使用XSL更改字段顺序的最佳方法是什么?

使用格式编辑

—根据说明编辑—

交换任意一对相邻的两个a元素的内容,其中第一个a元素的a1的值为"field_name1":

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a[a1='field_name1']">
<xsl:copy>
<xsl:apply-templates select="following-sibling::a[1]/*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a[preceding-sibling::a[1]/a1='field_name1']">
<xsl:copy>
<xsl:apply-templates select="preceding-sibling::a[1]/*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

注意,这是假设第二个a元素的a1的值不是"field_name1"。否则,结果将是……嗯,一团糟。

最新更新