我有一个包含许多模块XSLT的XSLT。每个子XSLT都有不同的处理模式。在主XSLT中有一个像这样的身份模板
<xsl:template match="node()|@*" mode="#all" priority="-1">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
但是当我们将其应用于转换时,我们发现某些不需要相同转换的模式会通过此转换,因此我们将其修改为如下所示并且运行完美:
<xsl:template match="node()|@*" mode="mode1 mode2 mode3 mode4 mode7 mode8" priority="-1">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
据我所知mode5
和mode6
不需要进行身份转换,需要在转换时避免使用。但是,通过上述步骤,我们每次添加新模式时都必须编辑此模板。
是否有任何其他流程,我们将身份模板应用于模式#all
并仅避免mode5
和mode6
,以避免未来的发展冲突。
答案 0 :(得分:1)
XSLT 3.0这样做的方法是使用默认操作声明模式:
<xsl:mode name="mode1" on-no-match="shallow-copy"/>
<xsl:mode name="mode2" on-no-match="shallow-copy"/>
<xsl:mode name="mode3" on-no-match="shallow-copy"/>
<xsl:mode name="mode4" on-no-match="shallow-copy"/>
<xsl:mode name="mode7" on-no-match="deep-skip"/>
<xsl:mode name="mode8" on-no-match="fail"/>
当你看起来每个模块有一个模式时,通常会将模式声明放在模块中。
这可能不会直接帮助你。但是,在使用每模块单模式方法后,我倾向于在适用的每个模块中复制默认模板规则,仅适用于一种模式,而不是使用模式列表或mode="#all"
。
答案 1 :(得分:1)
我认为没有办法定义,例如//since two logic checks are being performed,
//it is advantageous to put the data from the query
//into memory so you don't have to get the
//same result twice
String foo = data.getEmployeeID();
if (foo != null)
{
if (!(foo.equals("")))
{
//the result is neither null or empty
}
else
{
//the result is not null but it is empty
}
}
else
{
//the result is null
}
所以我担心答案是否定的,你必须做一些编辑。