xslt:如何在处理过程中将两个模板应用于同一节点?

Alt*_*eus 4 xml xslt-2.0

我有一个XSL模板,匹配任何元素与<var>子:

<xsl:template match="*[var]">
    <xsl:copy >
        <xsl:attribute name="editable">
            <xsl:for-each select="var[@attr]">
                <xsl:value-of
                              select="concat(@attr,
                                             substring(' ',
                                                       1 div (position()!=last())))"/>
            </xsl:for-each>
        </xsl:attribute>
        <xsl:attribute name="constraints">
            <xsl:for-each select="var[@ok]">
                <xsl:value-of
                              select="concat(@attr,':',@ok,
                                             substring(';',
                                                       1 div (position()!=last())))"/>
            </xsl:for-each>
        </xsl:attribute>
        <!-- if this is an <a> then we have to put the stuff inside it inside it -->
        <xsl:apply-templates select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

它将attrvar元素的s 连接到editable父元素的属性中; 和oks成constraints.

然后我有一个匹配任何<field>元素的模板:

<xsl:template match="field">
     <span>
        <xsl:attribute name="field">
            <xsl:choose>
                <xsl:when test="boolean(@name)">
                   <xsl:value-of select="./@name"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>true</xsl:text>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:apply-templates />
    </span>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

<span field="name">如果字段有一个名称,则只需将其转换为与字段相同的名称,否则为"true".

我遇到的问题是,*[var]如果该字段有<var>一个孩子,则匹配一个字段.但我希望发生的是为*[var]匹配第一个,然后field匹配以及,但事后.

目前,有一个输入

<field name="field1">
    <var attr="class" ok="small,smaller" />
    Text
</field>
Run Code Online (Sandbox Code Playgroud)

我明白了

<field name="field1" editable="class" constraints="class:small,smaller">
    Text
</field>
Run Code Online (Sandbox Code Playgroud)

但我想要

<span field="field1" editable="class" constraints="class:small,smaller">
    Text
</span>
Run Code Online (Sandbox Code Playgroud)

我找到了一些关于做两次通过的答案,但我不确定这是否是正确的答案,也不知道如何实现我找到的答案.我应该如何处理这个问题,如果有一个简单的答案,它是什么?:)

TIA Altreus

Mic*_*Kay 7

如果要将两个模板应用于同一节点,可以使用xsl:next-match:从与节点匹配的最高优先级规则中,可以调用xs:next-match来调用次高,等等.当然,您可以使用xsl:template上的priority属性"手动"调整优先级.

这里还有其他几种可能性:

(a)在我看来,"var"元素的处理可以在与var元素匹配的模板中完成,而不是*[var],在这种情况下,它可以由xsl调用:apply-模板以通常的方式

(b)第一个模板可以在特殊模式下使用apply-templates调用第二个模板

(c)第一个模板可以在变量中构造一个临时元素,然后将模板应用于该模板.