XSLT 默认模板模式



我有几个特定于内容类型的 XSLT,到目前为止,它们仅彼此独立使用。 即: content-type-A.xml => content-type-A.xslt .但是,最近的更改要求联接它们,因为新文档将包含来自多个内容类型的聚合内容。

主要问题是内容类型共享元素和属性名称,因此不可能简单地将特定于内容类型的 XSLT 包含在主聚合 XSLT 中。将它们分开的最直接方法是应用与 XSLT 中每个模板的内容类型相对应的模式。这将需要更新数百个模板以及工作流其他部分中的依赖项,这些依赖项需要在执行 XSLT 时更新以使用该初始模式。

有没有办法声明模板的默认模式 - 或实现等效的解决方法?本质上,我想声明一次模板的模式,然后:除非指定,否则所有模板都处于该模式,除非指定,否则所有应用的模板都处于该模式。

XML

命名空间是处理在单个 XML 文档中必须使用不同的标记词汇表时出现的识别和冲突问题的常用方法。 此外,如果您希望单独维护输入"内容类型"文档的 XSD,并且还希望有一个 XSD 来管理新组合的 XML 文档,XML 命名空间将有助于使标记定义和转换变得理智。

XSLT 模式

与对匹配模式的仔细上下文调整相结合,可能有助于隔离对管道的 XSLT 阶段所做的更改的影响。 但是,仔细比较这两种方法对整个系统长期可维护性的影响的架构将是谨慎的。

使用支持 default-mode 的 XSLT 3.0 兼容处理器:

http://www.w3.org/TR/xslt-30/#default-mode

使用XSLT添加的模式生成XSLT(如Kay博士所建议的那样)。这会将作为样式表变量传入的模式添加为默认模式,同时保留现有模式:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xso="dummy" version="2.0">
   <xsl:output method="xml" xml:space="preserve" indent="no" encoding="UTF-8" />
   <xsl:namespace-alias stylesheet-prefix="xso" result-prefix="xsl" />
   <xsl:param name="mode" required="yes" />
   <xsl:template match="xsl:template">
      <xso:template mode="{ (@mode, $mode)[1] }">
         <xsl:apply-templates select="@* except @mode|node()" />
      </xso:template>
   </xsl:template>
   <xsl:template match="xsl:apply-templates">
      <xso:apply-templates mode="{ (@mode, '#current')[1] }">
         <xsl:apply-templates select="@* except @mode|node()" />
      </xso:apply-templates>
   </xsl:template>
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

最新更新