我有以下模板(摘录):
<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>