如何使用 XSLT 省略 XSD 模式标记 'sequence'?
how to omit XSD schema tag 'sequence' with XSLT?
- 我已经为我们的 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);有时接收应用程序是为了期望特定的顺序而编写的。因此,我建议仅将您的转换应用于那些元素顺序无关紧要的稀有文档。
- 我已经为我们的 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);有时接收应用程序是为了期望特定的顺序而编写的。因此,我建议仅将您的转换应用于那些元素顺序无关紧要的稀有文档。