我的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>
答案 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>