我有一个以下类型的XML文档:
<item>
<item>
<item>
... (same elements <item> ... </item> here)
</item>
</item>
</item>
...以及以下XSL转换:
<xsl:template match="item"><xsl:text>
open</xsl:text>
<xsl:apply-templates/><xsl:text>
close</xsl:text>
</xsl:template>
我获得的是:
open
open
open
close
close
close
所以我想知道是否有可能以某种方式获得带有缩进的输出:
open
open
open
close
close
close
感谢您的帮助!
P.S。通过让转换的输出方法成为HTML,绝对有可能获得我想要的东西。但是,我需要在文本中“直接”进行缩进,而不是使用任何类型的HTML列表等。
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="item">
<xsl:param name="pIndent" select="' '"/>
<xsl:value-of select="concat('
', $pIndent, 'open')"/>
<xsl:apply-templates>
<xsl:with-param name="pIndent"
select="concat($pIndent, ' ')"/>
</xsl:apply-templates>
<xsl:value-of select="concat('
', $pIndent, 'close')"/>
</xsl:template>
<xsl:template match="node()[not(self::item)]">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<item>
<item>
<item> ...
<item> ... </item>
</item>
</item>
</item>
生成所需的缩进输出:
open
open
open
open
close
close
close
close
<强>解释强>:
$pIndent
参数用于保存要添加到非空白空间输出的空白字符串。每当使用xsl:apply-templates
时,使用此参数传递的值将扩展两个空格。
答案 1 :(得分:0)
这很简单,只需在<xsl:text>
元素中使用标签(我不知道如何将它们放在这里):
<xsl:template match="item"><xsl:text>
open</xsl:text>
但是,要实现缩进结构,您需要创建一个命名模板或xpath函数,该函数会多次输出制表符(或空格)。
答案 2 :(得分:0)
使用子字符串有一种“欺骗”方式。要修改您已有的模板:
<xsl:template match="item">
<xsl:variable name="indent" select="substring(' ',1,count(ancestor::*)*2)" />
<xsl:text> </xsl:text>
<xsl:value-of select="$indent" />
<xsl:text>open</xsl:text>
<xsl:apply-templates/>
<xsl:text> </xsl:text>
<xsl:value-of select="$indent" />
<xsl:text>close</xsl:text>
</xsl:template>
正如您所看到的,它只是通过获取一部分空格的一部分,根据元素的多少祖先(乘以2)插入一些空格。我在这里使用了10,这意味着它将在5个级别停止缩进,但如果你的XML比那个更深,你可以使用更长的字符串。
它还具有以下优点:您可以使用不同的字符串轻松地进行自定义缩进。例如,如果您想清楚地显示每行的缩进程度,可以使用1-2-3-4-5-6-7-8-9-
。
我还用
替换了回车符,只是为了让代码更易于缩进以便于阅读。