2013-07-04 31 views
1

我有XML,看起來像這樣:選擇子元素(而無需離開當前節點)在XLST

<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",沒有運氣。如何在不「離開」當前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

通過其子元素是怎麼想的將每個曲目與每個playas關聯起來?每首歌曲是否都有可用的專輯格式? –

+0

是的,我已經做到了每個曲目都可以在每個playas擴展中使用。我不確定你的第一個問題是什麼,但是我需要從每個playas中訪問「當前」曲目的標題。 – Trojan

+0

@trojansdestroy:你能告訴我們你的預期產出嗎?你不能使單個屬性和處理兩個元素,我的意思是你不能將多個值寫入單個屬性。感謝yolu,Peter – Peter

回答

1

當你的<xsl:for-each select="../playas">裏面你已經是在playas元素上下文。所以要檢索它的title孩子,你需要的只是<xsl:value-of select="title" />。並檢索曲目標題你coud設置當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> 

+0

playas元素沒有標題元素(我只需要曲目標題)。使用變量確實有用,所以謝謝!我不知道變量是一個選項。除此之外,有沒有辦法做到這一點?它看起來像變量是一種「黑客」,應該有直接的方式來訪問曲目標題。 – Trojan

相關問題