Преобразуйте дерево XML в плоский список узлов, используя XSL - PullRequest
1 голос
/ 01 октября 2010

Как я могу преобразовать этот 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 ]

4 голосов
/ 01 октября 2010

Сложно точно сказать, что вы пытаетесь сделать из этого примера, но в целом вы можете сгладить дерево XML с небольшим изменением шаблона идентификации:

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

Возможно, вы сможете адаптироватьэто для ваших конкретных потребностей.

1 голос
/ 01 октября 2010
<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...