2016-03-22 76 views
0

我已經鍵入了一些電影的XML。我需要使用XSLT轉換將信息從「屏幕1」輸出到表格中。該表應顯示「屏幕1」和什麼電影正在播放,類似於下表的三個篩選時間:如何使用xsl:foreach從非嵌套元素中選擇變量

╔════════════╦═════════════╗ 
║Showing Time║ Film  ║ 
╠════════════╬═════════════╣ 
║ 1:30pm  ║ The Revenant║ 
║ 5:00pm  ║ The Revenant║ 
║ 8:30pm  ║ The Revenant║ 
╚════════════╩═════════════╝ 

這裏是我的XML,雖然我不知道它是否被寫入做對於XSLT最好的方法:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="Assignment1.xsl"?> 
<Cinema> 
    <Name> Old Street Cinema</Name> 
    <Address>23 Old Street, Oxford</Address> 
    <Telephone>01865 123456</Telephone> 
    <Owner>John Arbuttle</Owner> 
    <Showings> 
    <Showing> 
     <Films> 
     <Film> 
      <Screen>1</Screen> 
      <Name>The Revenant</Name> 
      <Usher>Sarah Eccles</Usher> 
     </Film> 
     <Film> 
      <Screen>2</Screen> 
      <Name>Zoolander 2</Name> 
      <Usher>Ari Ventaro</Usher> 
     </Film> 
     <Film> 
      <Screen>3</Screen> 
      <Name>Star Wars the Force Awakens</Name> 
      <Usher>Jake Calcas</Usher> 
     </Film> 
     </Films> 
    </Showing> 
    </Showings> 
    <ScreenTimes> 
    <Time name="Afternoon">1:30pm</Time> 
    <Time name="Early Evening">5:00pm</Time> 
    <Time name="Late Evening">8:30pm</Time> 
    </ScreenTimes> 
</Cinema> 

這裏是未完成的XSL文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/Cinema"> 
    <html> 
     <body> 
     <h1>The Old Street Cinema </h1> 
     <h2>Screen 1</h2> 
     <table border="1"> 
      <tr> 
      <th>Showing Time</th> 
      <th>Film</th> 
      </tr> 
      <xsl:for-each select="ScreenTimes"> 
      <tr> 
       <td><xsl:value-of select="Time" /></td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

我的問題是:我該如何使用XSLT把兩個放映時間和電影的名字表時t他的元素不是嵌套在一起的。

+0

我將您的XML修復爲_well-formed_,但我不知道它是否是您期望的形式。但是,XML仍未提供將電影與播放時間關聯的必要信息。所以,到目前爲止,除非您認爲第一個播放時間與列出的第一個電影標題相符,否則此問題無法解決。 – zx485

+0

我認爲通過將每個元素中的三個放映嵌套在一起或反之亦然,將有更好的方式來對XML進行編碼,但我仍然不確定如何使用XSLT將信息放入表中。 – Henrymcp

+0

@Henrymcp XSLT應該如何知道選擇哪個屏幕?你會傳遞它作爲參數,還是你想硬編碼到樣式表或...? –

回答

0

的回答你的問題是雙重的:

  • 第一種可能性:使用播放時間Time的指數爲指標,電影標題:

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/Cinema"> 
    <html> 
     <body> 
     <h1>The Old Street Cinema </h1> 
     <h2>Screen 1</h2> 
     <table border="1"> 
      <tr> 
      <th>Showing Time</th> 
      <th>Film</th> 
      </tr> 
      <xsl:apply-templates /> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="text()" /> 

    <xsl:template match="ScreenTimes"> 
    <xsl:for-each select="Time"> 
     <xsl:variable name="pos" select="position()" /> 
     <tr> 
     <td><xsl:value-of select="text()" /></td> 
     <td><xsl:value-of select="/Cinema/Showings/Showing/Films/Film[$pos]/Name/text()" /></td> 
     </tr> 
    </xsl:for-each> 
    </xsl:template>  
</xsl:stylesheet> 
  • 第二種可能性:Restruc TURE XML文件以納入播放時間在你的電影數據,以便XML文件看起來像這樣:

XSLT:

<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="a.xslt"?> 
<Cinema> 
    <Name> Old Street Cinema</Name> 
    <Address>23 Old Street, Oxford</Address> 
    <Telephone>01865 123456</Telephone> 
    <Owner>John Arbuttle</Owner> 
    <Showings> 
    <Showing> 
     <Films> 
     <Film> 
      <Screen>1</Screen> 
      <Name>The Revenant</Name> 
      <Usher>Sarah Eccles</Usher> 
      <Playtime>Afternoon</Playtime> 
     </Film> 
     <Film> 
      <Screen>2</Screen> 
      <Name>Zoolander 2</Name> 
      <Usher>Ari Ventaro</Usher> 
      <Playtime>Early Evening</Playtime> 
     </Film> 
     <Film> 
      <Screen>3</Screen> 
      <Name>Star Wars the Force Awakens</Name> 
      <Usher>Jake Calcas</Usher> 
      <Playtime>Late Evening</Playtime> 
     </Film> 
     </Films> 
    </Showing> 
    </Showings> 
    <ScreenTimes> 
    <Time name="Afternoon">1:30pm</Time> 
    <Time name="Early Evening">5:00pm</Time> 
    <Time name="Late Evening">8:30pm</Time> 
    </ScreenTimes> 
</Cinema> 

和XSLT文件提取相關數據輸入到HTML表格像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/Cinema"> 
    <html> 
     <body> 
     <h1>The Old Street Cinema </h1> 
     <h2>Screen 1</h2> 
     <table border="1"> 
      <tr> 
      <th>Showing Time</th> 
      <th>Film</th> 
      </tr> 
      <xsl:apply-templates /> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="text()" /> 

    <xsl:template match="ScreenTimes"> 
    <xsl:for-each select="Time"> 
     <xsl:variable name="time" select="@name" /> 
     <tr> 
     <td><xsl:value-of select="text()" /></td> 
     <td><xsl:value-of select="/Cinema/Showings/Showing/Films/Film[Playtime = $time]/Name" /></td> 
     </tr> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

這遠不是完美的,因爲很可能每個播放時間有多個電影。您必須「反轉」for-each循環才能實現此目的 - 這意味着迭代電影並關聯時間。但是,沒有更多的信息,我無法給出更好的答案。

+0

這看起來好多了,但我沒有說明的一件事是每個屏幕都有3次顯示時間。此外,該表僅輸出來自'屏幕1'的信息,這意味着一部電影重複3次(參見問題表) – Henrymcp

+0

@Henrymcp:是的。這聽起來更合理,每個屏幕都有自己的一套電影。請使用此信息和期望的結果更新您的問題。繼續我的答案,它應該是一塊蛋糕,以滿足您的(尚未提到)的要求。 – zx485

0

以下樣式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/Cinema"> 
    <xsl:variable name="film" select="Showings/Showing/Films/Film[1]/Name" /> 
    <html> 
     <body> 
      <h1>The Old Street Cinema </h1> 
      <h2>Screen 1</h2> 
      <table border="1"> 
       <tr> 
        <th>Showing Time</th> 
        <th>Film</th> 
       </tr> 
       <xsl:for-each select="ScreenTimes/Time"> 
        <tr> 
         <td><xsl:value-of select="." /></td> 
         <td><xsl:value-of select="$film" /></td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

應用到自己的輸入,將返回(示出爲呈現):

enter image description here

  • 屏幕#是硬編碼的(正如您的屏幕名稱);
  • 您的XML可以通過刪除ShowingFilms包裝器來簡化;
  • 您的XML假定所有屏幕的屏蔽時間相同。