如何使用 XSLT 省略 XSD 模式标记 'sequence'?

how to omit XSD schema tag 'sequence' with XSLT?

  1. 我已经为我们的 XML 文件(XML 提要)应用了一些 XSLT 格式化程序,有点美化,标签按 字母顺序:
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates>
                <xsl:sort select="name()" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates>
                <xsl:sort select="name()" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*/*">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates>
                <xsl:sort select="name()" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*/*/*">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates>
                <xsl:sort select="name()" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*/*/*/*">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates>
                <xsl:sort select="name()" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

2.But 我们的几个 XML 文件最初使用特定的 XSD-schema 应用标签 <xs:sequence> 要求 严格顺序 的指定元素和模式验证器失败。

当然我们可以从美化中排除这几个文件,但问题是:我们可以通过某种方式配置我们的 XSLT 以避免排除这些文件吗? XSD-无法更改架构。

您当然可以尝试在匹配模式中使用像 /*/*/*/*[not(self::xs:sequence)] 这样的谓词,声明 xmlns:xs="http://www.w3.org/2001/XMLSchema"。我不会尝试说明哪些​​模式需要它,但我不认为 XSD 模式可以具有 xs:sequence 作为 /*/*/*.

首先,您不需要有五个具有不同匹配模式的相同模板规则。带有 match="*" 的单个模板规则就可以很好地完成工作。

其次,无论是否存在模式,元素的顺序通常都很重要。有时有语义意义(章节中段落的顺序需要保留,文章作者的顺序也是如此),有时有常规顺序而不是字母顺序(table 标题在 table body);有时接收应用程序是为了期望特定的顺序而编写的。因此,我建议仅将您的转换应用于那些元素顺序无关紧要的稀有文档。