代码之家  ›  专栏  ›  技术社区  ›  NVI

使用XSL将XML树转换为简单的节点列表

  •  1
  • NVI  · 技术社区  · 14 年前

    如何转换此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 回复  |  直到 14 年前
        1
  •  1
  •   Nick Jones    14 年前
    <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>
    
        2
  •  4
  •   Flynn1179    14 年前

    很难准确地知道您要从这个示例中做什么,但是一般来说,您可以通过稍微修改标识模板来扁平XML树:

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

    你也许可以根据你的具体需要来调整它。