Главная » XSLT » Выполнение обхода в обратном порядке

0

Задача

Требуется рекурсивно обработать сначала потомков элемента, а затем его самого.

Решение

Решения в этом рецепте имеют такой общий вид:

<xsl:template match="node()">

<!– Обработать потомков –> <xsl:apply-templates/>

<!– Сделать что-то с текущим узлом –>

</xsl:template>

Обсуждение

Термин обратный порядок применяется, когда речь идет об обходе дерева таким образом, что сначала рекурсивно посещаются потомки корневого узла (в обратном порядке), а затем он сам. При таком обходе первыми мы обрабатываем листовые узлы, а затем поднимаемся вверх по дереву до корня.

Применив обход в обратном порядке в структурной диаграмме организации (orgchart.xml), мы можем напечатать информацию о том, кто кому подчиняется, начиная с нижнего уровня иерархии. Код программы приведен в примере 5.8, а в примере 5.9 показан результат ее работы.

Пример 5.8. Таблица стилей

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/> <xsl:strip-space elements="*"/>

<xsl:template match="/employee" priority="10"> <xsl:apply-templates/>

<xsl:value-of select="@name"/><xsl:text> глава компании. </xsl:text> <xsl:call-template name="reportsTo"/>

<xsl:call-template name="HimHer"/> <xsl:text>. </xsl:text> <xsl:text>&#xa;&#xa;</xsl:text> </xsl:template>

<xsl:template match="employee[employee]"> <xsl:apply-templates/>

<xsl:value-of select="@name"/><xsl:text> менеджер. </xsl:text> <xsl:call-template name="reportsTo"/>

<xsl:call-template name="HimHer"/> <xsl:text>. </xsl:text> <xsl:text>&#xa;&#xa;</xsl:text> </xsl:template>

<xsl:template match="employee">

<xsl:text>Hиктo не подчиняется </xsl:text>

<xsl:value-of select="@name"/><xsl:text>. &#xa;</xsl:text> </xsl:template>

<xsl:template name="HimHer"> <xsl:choose>

<xsl:when test="@sex = ‘male’ ">

<xsl:text>емy</xsl:text> </xsl:when> <xsl:otherwise>

<xsl:text>ей</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template>

<xsl:template name="reportsTo"> <xsl:for-each select="*"> <xsl:choose>

<xsl:when test="position() &lt; last() – 1 and last() > 2">

<xsl:value-of select="@name"/><xsl:text>, </xsl:text> </xsl:when>

<xsl:when test="position() = last() – 1 and last() > 1"> <xsl:value-of select="@name"/><xsl:text> и </xsl:text> </xsl:when>

<xsl:when test="position() = last() and last() = 1">

<xsl:value-of select="@name"/><xsl:text> подчиняется </xsl:text> </xsl:when>

<xsl:when test="position() = last()">

<xsl:value-of select="@name"/><xsl:text> подчиняются </xsl:text> </xsl:when> <xsl:otherwise>

<xsl:value-of select="@name"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template>

</xsl:stylesheet>

Пример 5.9. Результат

Никто не подчиняется Phill McKraken. Никто не подчиняется Betsy Ross.

Ima Little менеджер. Betsy Ross подчиняется ей.

Nancy Pratt менеджер. Phill McKraken и Ima Little подчиняются ей.

Никто не подчиняется Walter H. Potter. Никто не подчиняется Craig F. Frye. Никто не подчиняется Hardy Hamburg. Никто не подчиняется Rich Shaker.

Wendy B.K. McDonald менеджер. Craig F. Frye, Hardy Hamburg, и Rich Shaker подчиняются ей.

Janу Doe менеджер. Walter H. Potter и Wendy B.K. McDonald подчиняются ей.

Никто не подчиняется Allen Bran. Никто не подчиняется Frank N.Berry. Никто не подчиняется Jack Apple.

Cindy Post-Kellog менеджер. Allen Bran, Frank N.Berry и Jack Apple подчиняются ей.

Никто не подчиняется R.P. McMurphy.

Jack Nicklaus менеджер. R.P. McMurphy подчиняется ему.

Никто не подчиняется Forrest Gump. Никто не подчиняется Andrew Beckett.

Tom Hanks менеджер. Forrest Gump и Andrew Beckett подчиняются ему. Никто не подчиняется Helen Prejean.

Susan Sarandon менеджер. Helen Prejean подчиняется ей.

Oscar Winner менеджер. Jack Nicklaus, Tom Hanks, и Susan Sarandon подчи­няются ему.

Mike Rosenbaum менеджер. Cindy Post-Kellog и Oscar Winner подчиняются ему.

Jil Michel глава компании. Nancy Pratt, Jane Doe, и Mike Rosenbaum подчиняются ей.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии