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



我有以下模板(摘录):

<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属性,该属性定义了何时应将它们添加到输出中。但我目前的做法是,例如,阻止具有较低pos值的section显示在具有较高位置的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。一定有更好的办法。

你试过这个吗?

<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>

相关内容

  • 没有找到相关文章

最新更新