Вот как я заставил это работать:
<?xml version="1.0" encoding="utf-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="//li">
<xsl:call-template name="loop">
<xsl:with-param name="maxcount" select="count(ancestor::li)"/>
<xsl:with-param name="initial-value" select="0"/>
</xsl:call-template>
<xsl:text>* </xsl:text>
<xsl:value-of select="normalize-space(text())"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="ul/li" />
</xsl:template>
<xsl:template name="loop">
<xsl:param name="maxcount"/>
<xsl:param name="initial-value"/>
<xsl:if test="$initial-value < $maxcount">
<xsl:text>	</xsl:text>
<xsl:call-template name="loop">
<xsl:with-param name="maxcount" select="$maxcount"/>
<xsl:with-param name="initial-value" select="$initial-value+1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Вот как это ломается:
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
Вы должны убедиться, что вывод XSLT является текстом, и вы также хотите удалить любые существующие пробелы.
<xsl:template match="//li">
...
</xsl:template>
Это ваш основной шаблон, который будет соответствовать каждому <li>
в документе. Первый шаг в этом шаблоне - вывести соответствующее количество символов табуляции (не стесняйтесь, чтобы это было пробелами или чем угодно). Это можно сделать, вызвав собственный шаблон loop
, который будет рекурсивно вызывать себя, с циклом от initial-value
до maxcount
, выводя символ табуляции (	
) на каждой итерации.
<xsl:text>* </xsl:text>
<xsl:value-of select="normalize-space(text())"/>
<xsl:text>
</xsl:text>
Этот блок просто выводит текст с *
перед и новой строкой (
) после. Обратите внимание, что я использовал функцию text()
вместо .
, чтобы получить значение узла. Если вы этого не сделаете, выходные данные родительского узла будут (как и должно быть в соответствии с рекомендацией W3C) объединить все дочерние текстовые узлы с родительским.
<xsl:apply-templates select="ul/li" />
Наконец, мы рекурсивно вызываем текущий шаблон, но явно ссылаемся на следующий <li>
, который является прямым потомком <ul>
- это удерживает нас от случайного вызова шаблона дважды для одного и того же родительского элемента.