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

Posted

技术标签:

【中文标题】使用 xslt 按升序对 xsd 格式的 XML 进行排序【英文标题】:Sorting a XML with xsd format in ascending order using xslt 【发布时间】:2020-11-12 18:29:00 【问题描述】:

以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> 

【问题讨论】:

您混淆了 XSD 和命名空间。请参阅:***.com/questions/34758492/… 【参考方案1】:

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

【讨论】:

您混淆了 XSD 和命名空间。 问题中的声明是。我的 xml 解析器对声明中的大写字母不满意。

以上是关于使用 xslt 按升序对 xsd 格式的 XML 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 显示 XSD 验证的 XML

XML、XSD 和 XSLT 学生的项目

根据 XSD 兼容 XML 输入 -> XSD 兼容 XML 输出的 1:1 映射从 XSD 生成 XSLT 文件

基于 XSD 变化的动态 XSLT 生成

for-each 并使用 xslt 对 xml 进行排序和分组

XML,XSD和XSLT学生的项目