我有一个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"
。否则,结果将是……嗯,一团糟。