2012-01-20 71 views
1

我對XSLT非常不滿,所以我不知道如何處理這個問題......我從EQ2數據庫獲取一個源。 XML看起來像這樣:通過XSL中的另一個屬性獲取屬性

<guilds limit="1" returned="1"> 
    <guild accounts="3" alignment="0" dateformed="1127855265" guildid="111" guildstatus="0" id="1111111111" last_update="1326986410" level="11" name="MyGuild" version="1" world="Permafrost" worldid="202"> 
    <ranks> 
     <rank id="0" name="Leader"/> 
     <rank id="1" name="Senior Officer"/> 
     <rank id="2" name="Officer"/> 
     <rank id="3" name="Senior Member"/> 
     <rank id="4" name="Member"/> 
     <rank id="5" name="Junior Member"/> 
     <rank id="6" name="Initiate"/> 
     <rank id="7" name="Recruit"/> 
    </ranks> 
    <members> 
     <member dbid="123456" rank="0" name="Dude1"/> 
     <member dbid="123457" rank="1" name="Dude2"/> 
     <member dbid="123458" rank="2" name="Dude3"/> 
     <member dbid="123459" rank="4" name="Dude4"/> 
     <member dbid="123460" rank="4" name="Dude5"/> 
     <member dbid="123461" rank="4" name="Dude6"/> 
    </members> 
    <events/> 
    </guild> 
</guilds> 

我試圖將行列添加到表中。該XSL(第1版)內容片段在其計算方法如下,但是從排名添加名字不能正常工作 - 我知道這部分是錯誤的:

<xsl:value-of select="rank/rank[@id=1]/@name"/> 

所以,我能得到一些幫助,使其工作也許是如何縮短它的想法?

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

<table width="100%" cellspacing="0" cellpadding="0" id="eq2roster" align="center"> 
<thead> 
    <tr> 
    <td colspan="4" class="eq2CharacterHeader">Character</td> 
    <td colspan="3" class="eq2TradeskillsHeader">Tradeskills</td> 
    </tr> 
    <tr class="ForumCategoryHeader"> 
    <th class="eq2NameHeader">Name</th> 
    <th class="eq2RankHeader">Rank</th> 
    <th class="eq2ClassHeader">Class</th> 
    <th class="eq2LevelHeader">Level</th> 
    <th class="eq2ArtisanHeader">Artisan</th> 
    <th class="eq2ArtisanLevelHeader">Level</th> 
    <th class="eq2SecondaryHeader">Secondary</th> 
    </tr> 
</thead> 
<tbody> 
    <xsl:for-each select="guilds/guild/members/member"> 
    <xsl:if test="@id &gt; 1"> 
    <tr> 
    <td class="eq2Name"> 
    <xsl:element name="a"> 
     <xsl:attribute name="href"> 
     <xsl:text>http://eq2players.station.sony.com/</xsl:text> 
     <xsl:value-of select="concat(normalize-space(/guilds/guild/@world), '/')"/> 
     <xsl:value-of select="concat(normalize-space(@name), '/')"/> 
     </xsl:attribute> 
     <xsl:attribute name="target"> 
     <xsl:text>_blank</xsl:text> 
     </xsl:attribute> 
     <xsl:value-of select="normalize-space(@name)"/> 
    </xsl:element> 
    </td> 

    <xsl:element name="td"> 
    <xsl:attribute name="class"> 
     <xsl:text>eq2Rank eq2rank-</xsl:text> 
     <xsl:value-of select="translate(normalize-space(guild/@rank),' ','')"/> 
    </xsl:attribute> 

     <xsl:choose> 
     <xsl:when test="member/@rank = 1"><span class = "rank1"><xsl:value-of select="ranks/rank[@id=1]/@name"/></span></xsl:when> 
     <xsl:when test="member/@rank = 2"><span class = "rank2"><xsl:value-of select="ranks/rank[@id=2]/@name"/></span></xsl:when> 
     <xsl:when test="member/@rank = 3"><span class = "rank3"><xsl:value-of select="ranks/rank[@id=3]/@name"/></span></xsl:when> 
     <xsl:when test="member/@rank = 4"><span class = "rank4"><xsl:value-of select="ranks/rank[@id=4]/@name"/></span></xsl:when> 
     <xsl:when test="member/@rank = 5"><span class = "rank5"><xsl:value-of select="ranks/rank[@id=5]/@name"/></span></xsl:when> 
     <xsl:when test="member/@rank = 6"><span class = "rank6"><xsl:value-of select="ranks/rank[@id=6]/@name"/></span></xsl:when> 
     <xsl:when test="member/@rank = 7"><span class = "rank7"><xsl:value-of select="ranks/rank[@id=7]/@name"/></span></xsl:when> 
     </xsl:choose> 

    </xsl:element> 

    <xsl:element name="td"> 
    <xsl:attribute name="class"> 
     <xsl:text>eq2Class eq2</xsl:text> 
     <xsl:value-of select="translate(normalize-space(type/@class),' ','')"/> 
    </xsl:attribute> 
    <xsl:value-of select="type/@class"/> 
    </xsl:element> 

    <td class="eq2level"><xsl:value-of select="type/@level"/></td> 

    <xsl:element name="td"> 
    <xsl:attribute name="class"> 
     <xsl:text>eq2ArtisanClass eq2</xsl:text> 
     <xsl:value-of select="translate(normalize-space(tradeskills/tradeskill/@class),' ','')"/> 
    </xsl:attribute> 
    <xsl:value-of select="tradeskills/tradeskill/@class"/> 
    </xsl:element> 

    <td class="eq2ArtisanLevel"><xsl:value-of select="tradeskills/tradeskill/@level"/></td> 

    <xsl:element name="td"> 
    <xsl:attribute name="class"> 
     <xsl:text>eq2Secondary eq2</xsl:text> 
     <xsl:value-of select="translate(normalize-space(secondarytradeskills/secondarytradeskill/@name),' ','')"/> 
    </xsl:attribute> 
    <xsl:value-of select="secondarytradeskills/secondarytradeskill/@name"/> 
    </xsl:element> 

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

</xsl:template> 
</xsl:stylesheet> 
+0

上下文是一切;是否可以用整個'xsl:template'來更新問題? –

+0

請提供確切的想要的輸出 - 否則我們必須猜測 - 這實際上意味着這個問題在目前狀態下很糟糕。請編輯和改進。 –

+0

@DevNull確定我已經包含了整個樣式表 – Mottie

回答

1

下面的表達式相關聯,其使用current()相應rank一個member(假設上下文節點是有問題的member):

../../ranks/rank[@id=current()/@rank]/@name 

完整的示例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="member"> 
     <td class="eq2Rank eq2rank-{guild/@rank}"> 
      <span class="rank{@rank}"> 
       <xsl:value-of 
        select="../../ranks/rank[@id=current()/@rank]/@name"/> 
      </span> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

輸出(基於最初發布樣本XML):

<td class="eq2Rank eq2rank-"> 
    <span class="rank0">Leader</span> 
</td> 
<td class="eq2Rank eq2rank-"> 
    <span class="rank1">Senior Officer</span> 
</td> 
<td class="eq2Rank eq2rank-"> 
    <span class="rank2">Officer</span> 
</td> 
<td class="eq2Rank eq2rank-"> 
    <span class="rank4">Member</span> 
</td> 
<td class="eq2Rank eq2rank-"> 
    <span class="rank4">Member</span> 
</td> 
<td class="eq2Rank eq2rank-"> 
    <span class="rank4">Member</span> 
</td> 
+0

謝謝,但排名仍然沒有顯示出來......我更新了我的問題整個樣式表和我的問題下的評論我已經在jsFiddle中包含HTML輸出 – Mottie

+0

您是否注意到鏈接的文件中的所有'member'元素實際上都沒有'rank'屬性? –

+1

如果它應該使用孩子'公會/ @等級'然後只需使用'../../等級/等級[@ id = current()/ guild/@ rank]/@ name' –

1

不知道你是否可以這樣做,但它可能是值得一試。在單個成員

<xsl:value = "//ranks/rank[@id = ./@rank]/@name"/> 

的情況下它使用的x路跳轉到頂部和尋找的行列節點,找到秩元素的ID屬性等於該成員的等級屬性,並抓住名字屬性

這是一個幾年以來,我不得不這樣XSL,但應該讓你擺脫XSL的:選擇阻止

+0

對不起,我忘記了包含我共享的片段是在for-each循環中的'。無論如何,正如我所說,我喜歡XSL和你分享的代碼給出了一個錯誤 - 不應該以「 Mottie

+0

是的,它應該是值。事情(單個成員記錄的上下文) – Hasteur

1

我真的不知道,如果我得到的問題。

Asume你有正確的rankid你可能想使用可變

<xsl:variable name="rank" select="translate(normalize-space(guild/@rank),' ','')"/> 

<span class = "rank{$rank}"><xsl:value-of select="ranks/rank[@id = $rank]/@name"/></span> 
+0

對不起,我更新了我的問題..該代碼段被包裹在for-each循環中。 – Mottie