在XSLT中选择兄弟节点的子元素(不离开当前节点)

时间:2013-07-04 04:52:41

标签: xml xslt

我的XML看起来像这样:

<library>
    <album>
        <!-- Album title, length, # of tracks, etc -->
        <playas>
            <extension>.mp3</extension>
            <type>audio/mpeg</type>
        </playas>
        <playas>
            <extension>.ogg</extension>
            <type>audio/ogg</type>
        </playas>

        <track>
            <!-- Track number, title, length -->
        </track>
        <!-- Many, many more tracks -->
    </album>
</library>

在我的XLS文件中,我想使用xls:for-each来确定每个曲目的source src属性。这是不起作用的:

<xsl:for-each select="track">
    <audio>
        <!-- Parent (album)'s playas elements -->
        <xsl:for-each select="../playas">
            <source>
                <xsl:attribute name="src">
                    <!-- Parent (album)'s title + '-src', where I store the audio files
                         along with current node (playas)'s extension -->
                    <xsl:value-of select="../title" />-src/<xsl:value-of select="title" /><xsl:value-of select="extension" />
                </xsl:attribute>
                <xsl:attribute name="type">
                    <xsl:value-of select="srctype" />
                </xsl:attribute>
            </source>
        </xsl:for-each>
    </audio>
</xsl:for-each>

上面的代码给出<source src="AlbumTitle-src/.mp3" type="audio/mpeg"> (or .ogg and audio/ogg) - 当前track的标题不存在。但是,代码是为每个音轨正确创建的,所以我需要知道的是如何获取当前曲目的标题(来自playas的上下文)。

我也试过for-each select="preceding-sibling::playas",没有运气。如何在不“离开”当前playas的情况下访问每个track的孩子?

编辑:我知道只需对每个playas扩展程序进行硬编码<source>即可轻松完成,但我希望以最少的实现进行此操作。

编辑2: @Peter:每个曲目的预期输出(等效的HTML)是

<audio>
    <source src="AlbumTitle-src/track.mp3" type="audio/mpeg" />
    <source src="AlbumTitle-src/track.ogg" type="audio/ogg" />
</audio>

1 个答案:

答案 0 :(得分:1)

当您在<xsl:for-each select="../playas">内时,您已经在playas元素上下文中。因此,要检索其title孩子,您只需要<xsl:value-of select="title" />。要检索曲目标题,您可以在track for-each内部设置变量,并在源输出元素中使用它,例如:

<xsl:for-each select="track">
<audio>
    <xsl:variable name="track_title" select="title" />
    <!-- Parent (album)'s playas elements -->
    <xsl:for-each select="../playas">
        <source>
            <xsl:attribute name="src">
                <!-- Parent (album)'s title + '-src', where I store the audio files
                     along with current node (playas)'s extension -->
                <xsl:value-of select="title" />-src/<xsl:value-of select="$track_title" /><xsl:value-of select="extension" />
            </xsl:attribute>
            <xsl:attribute name="type">
                <xsl:value-of select="srctype" />
            </xsl:attribute>
        </source>
    </xsl:for-each>
</audio>