XSLT模板避免某些模式

时间:2018-05-10 04:59:35

标签: xslt

我有一个包含许多模块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>

据我所知mode5mode6不需要进行身份转换,需要在转换时避免使用。但是,通过上述步骤,我们每次添加新模式时都必须编辑此模板。

是否有任何其他流程,我们将身份模板应用于模式#all并仅避免mode5mode6,以避免未来的发展冲突。

2 个答案:

答案 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 } 所以我担心答案是否定的,你必须做一些编辑。