2

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

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

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

4

3 回答 3

2

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

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

于 2013-11-06T20:22:22.083 回答
1

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

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

于 2013-11-06T21:19:53.417 回答
1

生成具有使用 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>
于 2013-11-07T00:03:57.887 回答