2014-02-20 52 views
0

考慮下面的XML文檔...如何使用引用的一個關鍵節點 - XSLT

<ws> 
     <series year="2005" mvp="Jermaine Dye"> 
      <team name="Chicago White Sox" wins="4" /> 
      <team name="Houston Astros" wins="0" /> 
     </series> 
     <series year="2004" mvp="Manny Ramirez"> 
      <team name="Boston Red Sox" wins="4" /> 
      <team name="St. Louis Cardinals" wins="0" /> 
     </series> 
    </ws> 

我創建了一個鍵就可以在每個系列中第一組的名稱屬性,我試圖循環並列出每個系列的每個名稱,如下所示:我目前沒有返回任何結果,我不知道什麼是錯我的價值的參考?...

<xsl:key name="winners" match="team[1]" use="@name" /> 

    <xsl:template match="/"> 
     <xsl:for-each select="ws/series"> 
      <xsl:value-of select="key('winners', @name)" /> 
     </xsl:for-each> 
    </xsl:template> 

預計產出將是...

Chicago White Sox (the first team from series 1) 
Boston Red Sox (the first team from series 2) 

xml數據我有提供的實際上只有2個系列元素有數百個。密鑰用於加速轉換過程並與其他密鑰一起生成我的結果文檔。

+0

爲什麼是一個關鍵的必要嗎?贏家不是**當前**系列的第一支兒童隊嗎?附:如果我們能夠看到所需的輸出,這將更加清晰。 –

+0

@ michael.hor257k我修改了我的帖子,希望更有幫助。我知道for-each循環運行良好,它只是不顯示團隊名稱,因爲我希望它。 – codingManiac

回答

1

我想列出了一線隊的名字在每個系列

使用的關鍵是這樣一個簡單的任務不必要的併發症。儘量簡單:

<xsl:template match="/"> 
    <xsl:for-each select="ws/series"> 
     <xsl:value-of select="team[1]/@name" /> 
    </xsl:for-each> 
</xsl:template> 

當然,你會希望添加某種包裝或分離到這一點,否則你只是得到所有名的混亂 - 說(假設輸出方法是text):

<xsl:template match="/"> 
    <xsl:for-each select="ws/series"> 
     <xsl:value-of select="team[1]/@name" /> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

編輯:

要使用的關鍵,你必須問自己什麼是一個團隊連接到其系列比(其它做到這一點(人工)作爲其孩子)。這裏的答案是'沒有'。但是,一個團隊可以訪問其父系列數據。因此,我們可以通過其父系列的某些屬性(如年份或MVP)來識別一個團隊。 MVP的可能不是唯一的系列,所以我們要儘量的關鍵:

<xsl:key name="team-by-year" match="team" use="parent::series/@year" /> 

這是說:如果你告訴我這一年,我會告訴大家,在一系列當年扮演的團隊。所以從這裏,它只是調用當前系列一年一個關鍵的問題:

<xsl:template match="/"> 
    <xsl:for-each select="ws/series"> 
     <xsl:value-of select="key('team-by-year', @year)[1]/@name" /> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
+0

我沒有選擇使用的關鍵:(是否有任何引用名稱屬性與鍵而不是?編輯:我相信使用的鍵是不必要的就像你相信它是,但是,我試圖學習使用密鑰來引用節點集 – codingManiac

+0

「*我沒有選擇使用密鑰*」爲什麼? –

+0

它是我正在開發的xsl練習的一部分,我試圖獲得基本的掌握如何使用給定的密鑰來引用我需要的數據。 – codingManiac

0

如果使用此

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

    <xsl:key name="winners" match="team[1]" use="@name" /> 

    <xsl:template match="/"> 
     <xsl:for-each select="ws/series/*"> 
      <xsl:value-of select="key('winners', @name)/@name" /> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
相關問題