2014-11-04 4 views
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, содержащий число, которое определяет, когда они должны быть добавлены к выходу. Но способ, который у меня есть в настоящее время, предотвращает с более низким значением 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 шаблона, пощекотать им имя, а затем вызвать их с текущим узлом в качестве параметра, но это не будет СУХОЙ. Должен быть лучший способ.

ответ

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

Мне нужна часть 'mode =" child "' 'для шаблона' section' (который отличается от того, который показан). Как вы это включили? – DanMan

+0

Извините, я пропустил это. Я отредактировал ответ, чтобы показать, как справиться с этим. –

+0

Mind = взорван. Благодарю. – DanMan

Смежные вопросы