我有以下模板(摘录):
<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。必须有更好的方法。
答案 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>