2013-05-17 59 views
0

需要從xml中的每組標籤中提取數據。現在我只獲取每行的第一組數據。這裏是XML我拉數據從如何將數據從xml中的標籤數據拉到xslt

<message> 
    <Data> 
     <Name>John Doe</Name> 
     <Date>2/14/2012</Date> 
     <Phone>1234567</Phone> 
    </Data> 

    <Data> 
    <Name>Jane Doe</Name> 
     <Date>4/19/2012</Date> 
     <Phone>2345678</Phone> 
    </Data> 

    <Data> 
     <Name>Mike Doe</Name> 
     <Date>12/14/2011</Date> 
     <Phone>3456789</Phone> 
    </Data> 
    </message> 

我使用的XSLT是這樣的。

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

    <xsl:template match="/message"> 
    <html> 
    <body> 
    <table border="1"> 
    <tr> 
      <th ColSpan="4">Person</th> 
    </tr> 
    <tr> 
      <th>Name</th> 
      <th>Date</th> 
     <th>Phone</th> 
      </tr> 
    <xsl:for-each select="//Data"> 
     <tr> 
    <td> 
    <xsl:value-of select="//Name" /> 
     </td> 
     <td> 
     <xsl:value-of select="//Date" /> 
     </td> 
     <td> 
     <xsl:value-of select="//Phone" /> 
     </td> 
     </tr> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

我的輸出結果只顯示John Doe關於所有三行的信息。

回答

0

嘗試刪除所有//的...

<xsl:for-each select="Data"> 
     <tr> 
      <td> 
       <xsl:value-of select="Name" /> 
      </td> 
      <td> 
       <xsl:value-of select="Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="Phone" /> 
      </td> 
     </tr> 
    </xsl:for-each> 
1
<tr> 
    <td> 
     <xsl:value-of select="//Name" /> 
    </td> 
    <td> 
     <xsl:value-of select="//Date" /> 
    </td> 
    <td> 
     <xsl:value-of select="//Phone" /> 
    </td> 
</tr> 

你的問題就出在這裏。您已選擇所有數據標籤並對它們進行迭代,但是當您獲取該值時,您將獲取文檔中的所有名稱,日期或電話標籤,然後獲取第一個標籤的值是John Doe的。

<tr> 
    <td> 
     <xsl:value-of select="Name" /> 
    </td> 
    <td> 
     <xsl:value-of select="Date" /> 
    </td> 
    <td> 
     <xsl:value-of select="Phone" /> 
    </td> 
</tr> 

由於在for-each中,您處於Data標記的範圍內,因此可以使用名稱來選擇子節點。

爲了XSLT的風格,我還建議將它們分成一個模板。所以,你最終的變換應該是這樣的:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > 
    <xsl:output method="html" version="1.1" encoding="iso-8859-1" /> 
    <xsl:template match="/message"> 
     <html> 
      <body> 
       <table border="1"> 
        <tr> 
         <th ColSpan="4">Person</th> 
        </tr> 
        <tr> 
         <th>Name</th> 
         <th>Date</th> 
         <th>Phone</th> 
        </tr> 
        <xsl:apply-templates select="Data"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="Data"> 
     <tr> 
      <td> 
       <xsl:value-of select="Name" /> 
      </td> 
      <td> 
       <xsl:value-of select="Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="Phone" /> 
      </td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

例子:http://www.xsltcake.com/slices/MzgTXl