如何创建具有所有层次结构的目录?

时间:2010-08-12 17:15:07

标签: xslt

给出以下XML文档:

<Include>
  <Feature Title="A">
    <Feature Title="1" />
    <Feature Title="2" />
  </Feature>
  <Feature Title="B">
    <Feature Title="3">
      <Feature Title="i" />
      <Feature Title="ii" />
    </Feature>
    <Feature Title="4" />
  </Feature>
</Include>

我需要生成一个类似于:

的文本文件
; Header

A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4

我实现这一目标的最佳尝试是XSL样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" omit-xml-declaration="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/">
    <xsl:text>; Header&#x0A;&#x0D;&#x0A;&#x0D;</xsl:text>
    <xsl:apply-templates select="//Feature" /></xsl:template>

  <xsl:template match="Feature">
    <xsl:value-of select="@Title" /><xsl:text>&#x0A;&#x0D;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

但是这会产生输出:

; Header

A
1
2
B
3
i
ii
4

如何在输出中显示所有级别的层次结构?

1 个答案:

答案 0 :(得分:10)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="Include">
        <xsl:text>; Header&#xA;&#xA;</xsl:text>
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="Feature">
        <xsl:param name="pPrevious" select="''"/>
        <xsl:value-of select="concat($pPrevious,@Title,'&#xA;')"/>
        <xsl:apply-templates>
            <xsl:with-param name="pPrevious" select="concat($pPrevious,@Title,'/')"/>
        </xsl:apply-templates>
    </xsl:template>
</xsl:stylesheet>

输出:

; Header

A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4

只是为了好玩,一行XPath 2.0:

concat('; Header&#xA;&#xA;',
       string-join(/Include//Feature/string-join(
            ancestor-or-self::Feature/@Title,'/'),
           '&#xA;')
      )