2014-01-10 185 views
0

我想弄清楚如何將樣式元素應用於不同的結構元素。XSLT複製文本節點

我的XML看起來是這樣的:

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <catalog> 
     <cd> 
      <title>Empire Burlesque</title> 
      <artist><bold>Bob</bold> Dylan</artist> 
     </cd> 
     <cd> 
      <title>Hide your <bold>heart</bold></title> 
      <artist>Bonnie Tyler</artist> 
     </cd> 
    </catalog> 

而我的最新的XSLT的嘗試看起來像這樣

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="bold"> 
<b><xsl:value-of select="." /></b> 
</xsl:template> 

<xsl:template match="/catalog"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Artist</th> 
     </tr> 
     <xsl:for-each select="cd"> 
     <tr> 
     <td><xsl:value-of select="title" /><xsl:apply-templates/></td> 
     <td><xsl:value-of select="artist" /><xsl:apply-templates/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 


</xsl:stylesheet> 

但結果複製的數據,而不是僅僅有粗體所需的零件。

回答

1

這裏有您需要什麼:

 <xsl:for-each select="cd"> 
     <tr> 
      <td><xsl:apply-templates select="title"/></td> 
      <td><xsl:apply-templates select="artist"/></td> 
     </tr> 
     </xsl:for-each> 

既然你沒有匹配titleartist默認將是他們的文本節點複製到輸出的任何模板。你自己不需要這樣做。

下面是一個使用更地道的「推」處理的修改:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="bold"> 
    <b><xsl:value-of select="." /></b> 
    </xsl:template> 

    <xsl:template match="/catalog"> 
    <html> 
     <body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
      <tr bgcolor="#9acd32"> 
      <th>Title</th> 
      <th>Artist</th> 
      </tr> 
      <xsl:apply-templates select="cd"/> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="cd"> 
    <tr> 
     <td><xsl:apply-templates select="title"/></td> 
     <td><xsl:apply-templates select="artist"/></td> 
    </tr> 
    </xsl:template> 

</xsl:stylesheet> 
1

下面是一個使用更少的明確的元素匹配的另一種選擇。在很多情況下,這將是你想要的,因爲它更簡單,更靈活。在某些情況下,這個不會是是你想要的,因爲你需要單獨處理每個元素。因人而異。

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/catalog"> 
     <html> 
      <body> 
       <h2>My CD Collection</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Title</th> 
         <th>Artist</th> 
        </tr> 
        <xsl:apply-templates /> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="cd"> 
     <tr><xsl:apply-templates /></tr> 
    </xsl:template> 
    <xsl:template match="cd/*"> 
     <td><xsl:apply-templates /></td> 
    </xsl:template> 
    <xsl:template match="bold"> 
     <b><xsl:apply-templates /></b> 
    </xsl:template> 
</xsl:stylesheet> 
0

您正在使用xsl:value-of處理一次,然後再次使用xsl:apply-templates;如果你不想讓它處理兩次,那就把它們中的一個切掉。