使用xslt按升序对xsd格式的XML进行排序



使用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文件存在于您所说的位置。

最新更新