【问题标题】:Sorting a XML with xsd format in ascending order using xslt使用 xslt 按升序对 xsd 格式的 XML 进行排序
【发布时间】: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> 

【问题讨论】:

标签: xml xslt xsd


【解决方案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 解析器对声明中的大写字母不满意。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 2011-10-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多