2011-12-08 22 views
2

您好我是新來的XSLT,我想用我的數據的值一起顯示父節點的值。XSLT檢索屬性信息,以顯示在表

我有這樣的XML ..

<?xml-stylesheet type="text/xsl" href="Sample.xsl"?> 
<DataView Client="Client1" ID="1000" TimeStamp="12/7/2011 5:35:09 PM"> 
<Group ID="5000" Name="GroupName1"> 
<SubGroup ID="7000" Order="0" Name="NameIWant1"> 
<Data ID="1" Name="DataName1" Order="0">1</Data> 
<Data ID="2" Name="DataName2" Order="0">2</Data> 
<Data ID="3" Name="DataName3" Order="0">3</Data> 
<Data ID="12" Name="DataName4" Order="0">4</Data> 
</SubGroup> 
<SubGroup ID="8000" Order="0" Name="NameIWant2"> 
<Data ID="1" Name="DataName1" Order="0">6</Data> 
<Data ID="2" Name="DataName2" Order="0">7</Data> 
<Data ID="3" Name="DataName3" Order="0">8</Data> 
<Data ID="12" Name="DataName4" Order="0">9</Data> 
</SubGroup> 
</Group> 
</DataView> 

香港專業教育學院編寫的基本XSL行走值

<?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="/"> 
    <html> 
    <body> 
    <h2>My Data</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>DataName1</th> 
     <th>DataName2</th> 
     <th>DataName3</th> 
     <th>DataName4</th> 
     </tr> 
     <xsl:for-each select="DataView/Group/SubGroup"> 
     <tr> 

     <xsl:for-each select="Data"> 
       <td><xsl:value-of select="."/></td> 
     </xsl:for-each> 

     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

如何檢索和顯示子組的屬性值「名稱」,所以我表看起來像這樣...

MyData 
NameIWant1 1 2 3 4 
NameIWant2 6 7 8 9 

任何幫助是非常感謝!!

回答

1

簡單,簡短的回答是添加以下只是內部for-each循環之前:

<td><xsl:value-of select="@Name"/></td> 

您在DataView/Group/SubGroup節點的情況下是了,所以你只需要使用屬性軸說明符(@)按名稱選擇其屬性之一。

但是,(通常情況下)我認爲這是更好地表達使用個人模板。在XSLT中幾乎不需要for-each循環。下面的樣式表產生所需的結果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My Data</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Subgroup</th> 
         <th>DataName1</th> 
         <th>DataName2</th> 
         <th>DataName3</th> 
         <th>DataName4</th> 
        </tr> 
        <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="SubGroup"> 
     <tr> 
      <td><xsl:value-of select="@Name"/></td> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="Data"> 
     <td><xsl:apply-templates/></td> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<html> 
    <body> 
     <h2>My Data</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
      <th>Subgroup</th> 
      <th>DataName1</th> 
      <th>DataName2</th> 
      <th>DataName3</th> 
      <th>DataName4</th> 
     </tr> 
     <tr> 
      <td>NameIWant1</td> 
      <td>1</td> 
      <td>2</td> 
      <td>3</td> 
      <td>4</td> 
     </tr> 
     <tr> 
      <td>NameIWant2</td> 
      <td>6</td> 
      <td>7</td> 
      <td>8</td> 
      <td>9</td> 
     </tr> 
     </table> 
    </body> 
</html> 
+0

1用於短/簡單的辦法,並使用單獨的模板的正確的方法兩者。 –

+0

Thankyou完美的工作如何使用select =「@ Name [contains(。,NameIWant1)]」將過濾器應用於第一個模板,並將其應用於模板match =「Data」模板?我應該開始另一個線程? – kgjunk

0
<table border="1"> 
<thead> 
    <tr bgcolor="#9acd32"> 
    <th>SubGroupName</th> 
    <th>DataName1</th> 
    <th>DataName2</th> 
    <th>DataName3</th> 
    <th>DataName4</th> 
    </tr> 
</thead> 
<tbody> 
    <xsl:for-each select="DataView/Group/SubGroup"> 
    <tr> 
    <td> 
     <xsl:value-of select="@Name"/> 
    </td> 
    <xsl:for-each select="Data"> 
      <td><xsl:value-of select="."/></td> 
    </xsl:for-each> 

    </tr> 
    </xsl:for-each> 
</tbody> 
</table>