根据属性定义的顺序选择模板

时间:2014-11-04 14:21:57

标签: xslt xslt-1.0

我有以下模板(摘录):

<xsl:template match="section[@visible='1']">
    <dl>
        <dt><xsl:call-template name="content"/></dt>
        <xsl:apply-templates select="(page|file)[@visible='1']" />
        <xsl:apply-templates select="section[@visible=1]" mode="child" />
    </dl>
</xsl:template>
<xsl:template match="section[@visible='1']" mode="child">
    <dd><xsl:apply-templates select="." /></dd>
</xsl:template>

我的问题是最后两个apply-template元素。源XML元素(页面,文件,节,...)都具有包含数字的pos属性,该属性定义何时应将它们添加到输出中。但是,我目前使用它的方式会阻止具有较低section值的pos显示在具有较高位置的page元素之前。

我怎样才能实现这一目标?我试过这个:

<xsl:template match="section[@visible='1']">
    <dl>
        <dt><xsl:call-template name="content"/></dt>
        <xsl:call-template name="kids"/>
    </dl>
</xsl:template>

<xsl:template name="kids">
    <xsl:for-each select="node()">
        <xsl:sort select="@pos"/>
        <!-- what would go here? -->
    </xsl:for-each>
</xsl:template>

但我不知道要放入for-each循环的内容。我可以复制现有的2个模板,在它们上打一个名字,然后用当前节点作为参数调用它们,但这不会是DRY。必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

你试过这个吗?

<xsl:template match="section[@visible='1']">
    <dl>
        <dt><xsl:call-template name="content"/></dt>
        <xsl:apply-templates select="(page|file|section)[@visible='1']" mode="m">
          <xsl:sort select="@pos"/>
        </xsl:apply-templates>
    </dl>
</xsl:template>

<xsl:template match="*" mode="m">
  <xsl:apply-templates select="."/>
</xsl:template>

<xsl:template match="section" mode="m">
  <xsl:apply-templates select="." mode="child"/>
</xsl:template>