2013-10-17 87 views
1

Supose我有這樣的XML:XSLT如何獲取以下兄弟節點的屬性值?

<Items> 
    <Car name="12">Mercedes</Car> 
    <Bike name="23">Gt</Bike> 
    <House name="gt">123</House> 
    <Skate name="as">111</Skate> 
    <Plane name="bb">5522</Plane> 
    <tv name="sss">Sony</tv> 
</Items> 

及以下XSLT:

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

    <xsl:template match="Items"> 
    <table> 
     <xsl:for-each select="*[position() mod 2 != 0]"> 
     <tr> 
      <td> 
      <xsl:value-of select="name()"/> 
      </td> 
      <td> 
      <xsl:value-of select="."/> 
      </td> 
      <td> 
      <xsl:value-of select="name(following-sibling::*)"/> 
      </td> 
      <td> 
      <xsl:value-of select="following-sibling::*"/> 
      </td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

輸出即時得到的是:

<table> 
    <tr> 
    <td>Car</td> 
    <td>Mercedes</td> 
    <td>Bike</td> 
    <td>Gt</td> 
    </tr> 
    <tr> 
    <td>House</td> 
    <td>123</td> 
    <td>Skate</td> 
    <td>111</td> 
    </tr> 
    <tr> 
    <td>Plane</td> 
    <td>5522</td> 
    <td>tv</td> 
    <td>Sony</td> 
    </tr> 
</table> 

但我需要的是屬性@name代替節點名稱...我該怎麼做? 我需要的是這樣的:

<table> 
    <tr> 
    <td>12</td> 
    <td>Mercedes</td> 
    <td>23</td> 
    <td>Gt</td> 
    </tr> 
    <tr> 
    <td>gt</td> 
    <td>123</td> 
    <td>as</td> 
    <td>111</td> 
    </tr> 
    <tr> 
    <td>bb</td> 
    <td>5522</td> 
    <td>ss</td> 
    <td>sony</td> 
    </tr> 
</table> 

我知道,在第一<td>我可以用@name,但我怎麼能得到屬性「名稱」中的其他<td>以下同級節點的?

回答

3
<xsl:value-of select="following-sibling::*/@name"/> 

這應該返回以下兄弟的名稱屬性。

編輯


看來

<xsl:value-of select="following-sibling::*[1]/@name"/> 

是做正確的方式。

+0

差不多。 'following-sibling :: */@ name'返回所有**後面的兄弟姐妹的@名稱。你的意思是'follow-sibling :: * [1]/@ name'。 – Tomalak

+0

@Tomalak,我也這麼認爲,但Zirkonix的答案似乎有效。是否有任何理由爲什麼一個*有索引到這裏的兄弟姐妹? –

+0

有人糾正我,如果我錯了,但如果你沒有指定任何索引,默認情況下采取'[1]'。所以索引的唯一理由是指定除[1]之外的任何其他索引。 –

相關問題