我有几个特定于内容类型的XSLT,到目前为止它们只是彼此独立使用。即:content-type-A.xml
=> content-type-A.xslt
。但是,最近的更改需要将它们连接起来,因为新文档将包含来自多种内容类型的聚合内容。
主要问题是内容类型共享元素和属性名称,因此不可能只将内容类型特定的XSLT包含到主聚合XSLT中。将它们分开的最直接的方法似乎是在其XSLT中为每个模板应用与内容类型相对应的模式。这将需要更新数百个模板以及工作流的其他部分中的依赖项,这些模板在执行XSLT时需要更新以使用该初始模式。
有没有办法为模板声明默认模式 - 或者解决方法来实现等效?本质上,我想声明一次模板的模式,然后:除非指定,否则所有模板都处于该模式,除非指定,否则所有应用的模板都将进入该模式。
答案 0 :(得分:2)
XML Namespaces是处理识别和冲突问题的常用方法。此外,如果您希望单独维护输入“内容类型”文档的XSD,并且您还希望拥有一个管理新组合XML文档的XSD,那么XML命名空间将有助于为标记定义和转换带来理智。
XSLT modes结合对匹配模式的仔细上下文调整,可能有助于隔离更改对管道的XSLT阶段的影响。但是,对两种方法对整个系统的长期可维护性的影响进行仔细的架构比较是明智的。
答案 1 :(得分:1)
使用支持default-mode
的符合XSLT 3.0标准的处理器:
答案 2 :(得分: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>