使用xsd格式按升序对XML进行排序
由于XML中的xsd格式,我的xslt解决方案无法工作。在xsd的情况下必须使用什么?
这是我的XML输入:
<?XML version="1.0" encoding="utf-8"?>
<test xmlns="tempuri.org/Test.xsd">
<customer>
<number>
4
</number>
<number>
1
</number>
<number>
7
</number>
</customer>
</test>
我尝试过的:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我期望的输出:
<?XML version="1.0" encoding="utf-8"?>
<test xmlns="tempuri.org/Test.xsd">
<customer>
<number>
1
</number>
<number>
4
</number>
<number>
7
</number>
</customer>
</test>
您的XML应该是(头中的大写导致了问题(:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<customer>
<number>4</number>
<number>1</number>
<number>7</number>
</customer>
</test>
sort属性的xpath来自select的上下文。即,您正在选择<数量>,因此xpath是形式<数字>。因此,排序是当前节点的文本(text(((。
这个xsl可以执行您想要的操作:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" />
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="customer">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="text()"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果要包含xsd
<?xml version="1.0" encoding="utf-8"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="tempuri.org/Test.xsd"">
-然后确保xsd文件存在于您所说的位置。