2010-10-18 76 views
0

如何能把XSLT目前的數據我已經在XML下列數據在列,而不是

<data> 
<record> 
    <id>1</id> 
    <name>David</name> 
    <age>40</age> 
</record> 
<record> 
    <id>2</id> 
    <name>Tully</name> 
    <age>38</age> 
</record> 
<record> 
    <id>3</id> 
    <name>Solai</name> 
    <age>32</age> 
</record> 
<record> 
    <id>4</id> 
    <name>Michael</name> 
    <age>49</age> 
</record> 
<record> 
    <id>5</id> 
    <name>Tony</name> 
    <age>19</age> 
</record> 
<record> 
    <id>6</id> 
    <name>Ray</name> 
    <age>26</age> 
</record> 
<record> 
    <id>7</id> 
    <name>Leeha</name> 
    <age>13</age> 
</record> 
</data> 

,並想顯示這樣的數據:

ID 1  2 
Name David Tully 
Age 40 38 

我如何能做到這一點的XSLT?

回答

0

假設你輸出到HTML,您可以遍歷記錄排隊起來下對方:

<xsl:template match="data"> 
    <table> 
     <tr> 
     <td>ID</td> 
     <xsl:apply-templates select="record" mode="id" /> 
     </tr> 
     <tr> 
     <td>Name</td> 
     <xsl:apply-templates select="record" mode="name" /> 
     </tr> 
     <tr> 
      <td>Age</td> 
      <xsl:apply-templates select="record" mode="age" /> 
     </tr> 
    </table> 
</xsl:template> 

<xsl:template match="record" mode="id"> 
    <td><xsl:value-of select="id" /></td> 
</xsl:template> 

<xsl:template match="record" mode="name"> 
    <td><xsl:value-of select="name" /></td> 
</xsl:template> 

<xsl:template match="record" mode="age"> 
    <td><xsl:value-of select="age" /></td> 
</xsl:template> 
+0

謝謝,我需要在這些快速的答案。我谷歌它並沒有看到它的任何例子。這是一本你可以參考的好書嗎? – user479504 2010-10-18 16:38:41

+0

我發現XSLT更容易學習一段時間。最終你學會了警告和如何解決各種問題 – LorenVS 2010-10-18 16:45:14

+2

對不起,Faheemitian。對於這個網站的任何進攻方式。我不完全是程序員,我只是商業分析師。我花了整個週末來找到解決方案,但我無法。感謝LorenVS的動力。 – user479504 2010-10-18 17:00:47

4

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="data"> 
     <table> 
      <xsl:apply-templates select="*[1]"/> 
     </table> 
    </xsl:template> 
    <xsl:template match="record[1]/*" priority="1"> 
     <tr> 
      <th> 
       <xsl:value-of select="name()"/> 
      </th> 
      <xsl:call-template name="td"/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="record/*" name="td"> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
     <xsl:apply-templates select="following::*[count(../*)+1]"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<table> 
    <tr> 
     <th>id</th> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
     <td>7</td> 
    </tr> 
    <tr> 
     <th>name</th> 
     <td>David</td> 
     <td>Tully</td> 
     <td>Solai</td> 
     <td>Michael</td> 
     <td>Tony</td> 
     <td>Ray</td> 
     <td>Leeha</td> 
    </tr> 
    <tr> 
     <th>age</th> 
     <td>40</td> 
     <td>38</td> 
     <td>32</td> 
     <td>49</td> 
     <td>19</td> 
     <td>26</td> 
     <td>13</td> 
    </tr> 
</table> 

編輯:只是爲了表明這可能是一個不那麼rivial問題,一個更寬鬆的模式的XML樹(缺少記錄中的一些字段)呢?

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kElementByName" match="record/*" use="name()"/> 
    <xsl:template match="text()"/> 
    <xsl:template match="data"> 
     <table> 
      <xsl:apply-templates/> 
     </table> 
    </xsl:template> 
    <xsl:template match="record/*[count(.|key('kElementByName',name())[1])=1]"> 
     <tr> 
      <th> 
       <xsl:value-of select="name()"/> 
      </th> 
      <xsl:apply-templates select="../../record" mode="td"> 
       <xsl:with-param name="pName" select="name()"/> 
      </xsl:apply-templates> 
     </tr> 
    </xsl:template> 
    <xsl:template match="record" mode="td"> 
     <xsl:param name="pName"/> 
     <td> 
      <xsl:value-of select="*[name()=$pName]"/> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

有了這個輸入:

<data> 
    <record> 
     <id>1</id> 
     <name>David</name> 
    </record> 
    <record> 
     <name>Tully</name> 
     <age>38</age> 
    </record> 
    <record> 
     <id>3</id> 
     <age>32</age> 
    </record> 
</data> 

輸出:

<table> 
    <tr> 
     <th>id</th> 
     <td>1</td> 
     <td></td> 
     <td>3</td> 
    </tr> 
    <tr> 
     <th>name</th> 
     <td>David</td> 
     <td>Tully</td> 
     <td></td> 
    </tr> 
    <tr> 
     <th>age</th> 
     <td></td> 
     <td>38</td> 
     <td>32</td> 
    </tr> 
</table> 
+0

對於一個好的通用解決方案而言+1。 – 2010-10-18 16:56:28

+3

@Faheemitian:請遵循常見問題指南。帶上你的幽默和渴望學習。正如你所看到的,這裏給出的兩個答案是不同的。爲了理解我,你必須知道:命名模板,模板解析分辨率和「跟隨」軸。 – 2010-10-18 17:10:23

+0

你的回答比較好,我對此毫不懷疑。 – Faheem 2010-10-18 17:13:37