使用XSL将XML树转换为平面节点列表

时间:2010-10-01 10:17:44

标签: xml xslt xpath

如何转换此XML

<albums>
    <album title="New Zealand">
        <album title="Auckland">
            <image title="Mt Eden railroad station"/>
            <image title="Morgan St"/>
        </album>
    </album>
    <album title="Russia">
        <image title="Capital of Siberia"/>
    </album>
</albums>

进入那个

<div class="level-0">
    New Zealand
    Russia
</div>

<div class="level-1">
    Auckland
</div>

<div class="level-1">
    <img alt="Capital of Siberia"/>
</div>

<div class="level-2">
    <img alt="Mt Eden railroad station"/>
    <img alt="Morgan St"/>
</div>

2 个答案:

答案 0 :(得分:4)

很难准确地说明您要从此示例中尝试做什么,但通常,您可以通过稍微修改身份模板来展平XML树:

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
  </xsl:copy>
  <xsl:apply-templates select="node()" />
</xsl:template>

您可以根据自己的特定需求进行调整。

答案 1 :(得分:1)

<xsl:template match="/">
  <xsl:apply-templates select="/albums | //album"/>
</xsl:template>

<xsl:template match="albums | album">
  <div class="level-{count(ancestor-or-self::album)}">
    <xsl:apply-templates select="album/@title | image"/>
  </div>
</xsl:template>

<xsl:template match="album/@title">
  <xsl:value-of select="concat(.,'&#xA;')"/>
</xsl:template>

<xsl:template match="image">
  <img alt="{@title}"/>
</xsl:template>