這是我如何得到它的工作:
<?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>
的直接子 - 這讓我們意外地調用模板兩次相同的父元素。
+1非常好!我喜歡空白的想法 - 我知道必須有更好的方法來獲取縮進。 – 2009-01-23 02:23:50