如何在xml中为类似项创建多级列表?

时间:2017-03-05 13:39:16

标签: xml xslt

假设我有一个包含以下内容的XML文件:

<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <location>USA;New York</location>
    <year>1985</year>
  </cd>
  <cd>
    <title>Empire Burlesque II</title>
    <artist>Bob Dylan</artist>
    <location>USA;Houston</location>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <location>UK;London</location>
    <year>1988</year>
  </cd>
.
.
.

我的xml文件有点像这样

<bookmark xml-lang="en-US" branch="index" id="bm_id3">
     <bookmark_value>bullet lists;creating while typing</bookmark_value>
     <bookmark_value>lists;automatic numbering</bookmark_value>
.
.
.

使用这个xml,我想生成一个位置列表,如:

USA
  New York
  Houston
UK
  London

但目前我只能将单级列表作为

USA;New York
USA;Houston
UK;London

如何在没有对xml文件进行任何更改 的情况下完成此操作?

关于代码,我使用XSLT 1.0并获取列表的代码是(我的xml文件与上面提到的xml文件不同,因为它只是为了介绍问题)

<xsl:key name="b_parent" match="bookmark_value" use="substring-before(bookmark_value, ';')" />
<xsl:template match="/">
  <xsl:for-each select="//bookmark[@branch='index']">
    <xsl:for-each select="bookmark_value[count(. | key('b_parent', substring-before(bookmark_value, ';'))[1])=1 ]">
    <xsl:sort select="substring-before(bookmark_value, ';')"/>
    <xsl:variable name="href" select="concat($filename,'#',@id)"/>      
    <li><a href="{$href}" target="_top">
    <xsl:value-of select="substring-before(., ';')"/>
    </a></li>
      <xsl:for-each select="key('b_parent', substring-before(bookmark_value, ';'))">
        <xsl:sort select="substring-after(., ';')" />
        <ul><li><xsl:value-of select="substring-after(., ';')" /></li></ul>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

按以下方式对您的记录进行分组:

substring-before(concat(location, ';'), ';')