2011-09-29 111 views
1

我只是想用XSL樣式表創建一個示例XML文件。問題是,當我解析這兩個文件時,我得到一個奇怪的輸出。使用XML和XSLT

這裏是XML:

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="mySchema.xsl"?> 
<Artists> 
    <Artist> 
    <BandName>The Cure</BandName> 
    <Albums> 
     <Album> 
     <AlbumTitle>Disintegration</AlbumTitle> 
     <Tracks> 
      <track> 
      <Title>Plain Song</Title> 
      <Order>1</Order> 
      <Lenght> 
       <min>5</min> 
       <sec>12</sec> 
      </Lenght> 
      </track> 
      <track> 
      <Title>Pictures Of You</Title> 
      <Order>2</Order> 
      <Lenght> 
       <min>7</min> 
       <sec>24</sec> 
      </Lenght> 
      </track> 
     </Tracks> 
     </Album> 
     <Album> 
     <AlbumTitle>Wish</AlbumTitle> 
     <Tracks> 
      <track> 
      <Title>A Letter To Elise</Title> 
      <Order>4</Order> 
      <Lenght> 
       <min>5</min> 
       <sec>14</sec> 
      </Lenght> 
      </track> 
      <track> 
      <Title>From the Edge of the Deep Green Sea</Title> 
      <Order>2</Order> 
      <Lenght> 
       <min>7</min> 
       <sec>45</sec> 
      </Lenght> 
      </track> 
     </Tracks> 
     </Album> 
    </Albums> 
    </Artist> 

    <Artist> 
    <BandName>The Pogues</BandName> 
    <Albums> 
     <Album> 
     <AlbumTitle>If I Should Fall from Grace with God</AlbumTitle> 
     <Tracks> 
      <track> 
      <Title>Fairytale of New York</Title> 
      <Order>1</Order> 
      <Lenght> 
       <min>2</min> 
       <sec>20</sec> 
      </Lenght> 
      </track> 
      <track> 
      <Title>Sit Down by the Fire</Title> 
      <Order>13</Order> 
      <Lenght> 
       <min>4</min> 
       <sec>10</sec> 
      </Lenght> 
      </track> 
     </Tracks> 
     </Album> 
     <Album> 
     <AlbumTitle>Peace And Love </AlbumTitle> 
     <Tracks> 
      <track> 
      <Title>Young Ned Of The Hill</Title> 
      <Order>3</Order> 
      <Lenght> 
       <min>2</min> 
       <sec>45</sec> 
      </Lenght> 
      </track> 
      <track> 
      <Title>Boat Train</Title> 
      <Order>11</Order> 
      <Lenght> 
       <min>2</min> 
       <sec>40</sec> 
      </Lenght> 
      </track> 
     </Tracks> 
     </Album> 
    </Albums> 
    </Artist> 
</Artists> 

,這裏是XSLT文件:

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="Artist"> 
    <html> 
     <body> 
     <xsl:apply-templates select="BandName"/> 
     <br></br> 
     </body> 
    </html> 

    </xsl:template> 
    <xsl:template match="BandName"> 
    <b>Found a band!</b> 
    </xsl:template> 
</xsl:stylesheet> 

當我呈現了兩下,使用Visual Studio IDE中,我可以看到XML文件如何轉化爲XHTML。輸出看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
    <html><body><b>Found a band!</b><br /></body></html> 

    <html><body><b>Found a band!</b><br /></body></html> 

,當我看着這個在瀏覽器中,它的罰款,但我不開心怎麼< HTML> <體> </BODY> </HTML>顯示更多那一次。我究竟做錯了什麼?

感謝 傑森

回答

1

match="Artist"模板得到應用兩次。這就是結果樹中的兩個html元素。

嘗試使用樣式表的這個略微修改後的版本:

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="Artists"> 
    <html> 
     <body> 
     <xsl:apply-templates select="Artist"/> 
     <br></br> 
     </body> 
    </html>  
    </xsl:template> 

    <xsl:template match="Artist"> 
    <xsl:apply-templates select="BandName"/> 
    </xsl:template> 

    <xsl:template match="BandName"> 
    <b>Found a band!</b> 
    </xsl:template> 
</xsl:stylesheet> 
1

我已經編輯你的問題是什麼,我認爲這個問題是,身體和HTML標籤被包含兩次。那是因爲你爲藝術家的模板匹配了兩次。由於該模板包含body和html標籤,因此它們在輸出中包含兩次。

您需要使用for-each來匹配單個模板中的多個實例。下面是http://www.w3schools.com/給出的示例節選:

<xsl:for-each select="catalog/cd"> 
    <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="artist"/></td> 
    </tr> 
</xsl:for-each> 

檢查出更多的基礎知識w3school XSL部分:因爲你的源文件中有兩個Artist http://www.w3schools.com/xsl/

+0

謝謝大家!所有評論都非常有幫助! – jason

1

您的第一個模板匹配多個藝術家的元素。對於它匹配的每個Artist元素,它將輸出<html><body>...</>樹到結果文檔。你可以嘗試像下面這樣的東西。

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

    <xsl:template match="/Artists"> 
    <html> 
     <body> 
     <xsl:apply-templates select="Artist/BandName"/> 
     <br></br> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="BandName"> 
    <b>Found a band!</b> 
    </xsl:template> 

</xsl:stylesheet> 
1

您有多個Artist元素,並且「select」的匹配是抓住他們兩個。

0

最短的解決方案(無模板匹配Artist)的可能之一:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <html> 
    <body> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="Artist/BandName"> 
    <b>Found a band!</b><br /><br /> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet>