Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="album">
<xsl:param name="pLastPath"/>
<xsl:variable name="vPath">
<xsl:for-each select="ancestor-or-self::album">
<xsl:value-of select="@title"/>
<xsl:if test="not(position()=last())">/</xsl:if>
</xsl:for-each>
</xsl:variable>
<div>
<xsl:if test="$pLastPath">
<xsl:attribute name="id"><xsl:value-of select="$pLastPath"/></xsl:attribute>
</xsl:if>
<a href="#{$vPath}"><xsl:value-of select="@title"/></a>
</div>
<xsl:apply-templates select="node()">
<xsl:with-param name="pLastPath" select="$vPath"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="image">
<xsl:param name="pLastPath"/>
<div id="{$pLastPath}">
<img id="{$pLastPath}/{@title}"/>
</div>
<xsl:apply-templates select="node()">
<xsl:with-param name="pLastPath" select="$pLastPath"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
применительно к предоставленному документу XML :
<albums>
<album title="new_zealand">
<album title="auckland">
<image title="mt_eden_railroad_station"/>
</album>
</album>
</albums>
дает желаемый, правильный результат :
<div>
<a href="#new_zealand">new_zealand</a>
</div>
<div id="new_zealand">
<a href="#new_zealand/auckland">auckland</a>
</div>
<div id="new_zealand/auckland">
<img id="new_zealand/auckland/mt_eden_railroad_station"/>
</div>
ОБНОВЛЕНИЕ : @Tomalak выразил опасение, что косые черты недопустимы в значениях атрибутов HTML id.
Пожалуйста, не стесняйтесь заменять символ "/"
в этом решении любым допустимым символом (например, "_"
), который вы хотите.