XSL:“嵌套”结构的输出

时间:2012-02-17 13:30:58

标签: xml xslt

我有一个以下类型的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列表等。

3 个答案:

答案 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('&#xA;', $pIndent, 'open')"/>

  <xsl:apply-templates>
   <xsl:with-param name="pIndent"
        select="concat($pIndent, '  ')"/>
  </xsl:apply-templates>

  <xsl:value-of select="concat('&#xA;', $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>&#10;</xsl:text>
  <xsl:value-of select="$indent" />
  <xsl:text>open</xsl:text>
  <xsl:apply-templates/>
  <xsl:text>&#10;</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-

我还用&#10;替换了回车符,只是为了让代码更易于缩进以便于阅读。