2009-02-18 34 views
1

我有下面的XML文件:包括在XPath的一個不相關的元素的屬性

<phonebook> 
    <departments> 
     <department id="1" parent="" title="Rabit Hole" address="" email="" index=""/> 
     <department id="2" parent="" title="Big Pond" address="" email="" index=""/> 
    </departments> 
    <employees> 
     <employee id="1" fname="Daffy" lname="Duck" title="Admin" email="[email protected]" department="2" room="" /> 
     <employee id="2" fname="Bugs" lname="Bunny" title="Programmer" email="[email protected]" department="1" room="" /> 
    </employees> 
</phonebook> 

在顯示它,我想顯示僱員的詳細聯繫方式以及該部門,在那裏的標題他工作。下面是我的模板已經有了:

<xsl:for-each select="phonebook/employees/employee"> 
    <xsl:sort select="@lname" /> 
    <tr> 
     <td> 
      <span class="lname"><xsl:value-of select="@lname"/></span> 
      <xsl:text> </xsl:text> 
      <span class="fname"><xsl:value-of select="@fname"/></span> 
     </td> 
     <td><xsl:value-of select="@title"/></td> 
     <td> 
      <xsl:value-of select="/phonebook/departments/department[@id='{@department}']/@title"/> 
     </td> 
     <td><a href="mailto:{@email}"><xsl:value-of select="@email"/></a></td> 
    </tr> 
</xsl:for-each> 

的問題是,下面的規則似乎並沒有工作:

<xsl:value-of select="/phonebook/departments/department[@id='{@department}']/@title"/> 

我想這是因爲XSLT引擎查找該department屬性在department元素中,而不在employee元素中。但是,我不知道如何解決它。任何人都可以給我一個提示嗎?

回答

3

很多方面,但一個不錯的可重複使用的一個方法是使用一個key

定義:

<xsl:key name="dept" match="/phonebook/departments/department" use="@id"/> 

使用(在當前節點是<employee>:!

<xsl:value-of select="key('dept', @department)/@title"/> 
+0

請*簡化*您的。我們可以使用:match =「department」。事實上,「匹配」屬性的值是*匹配模式*,這比完整的XPath表達式更簡單。 – 2009-02-18 14:57:16

2

Select中的{}不受支持,我更喜歡使用變量,但anothor選項將使用current()。不過,我想可能只是使用類似:

<xsl:variable name="departmentId" select="@department" /> 
<xsl:value-of select="/phonebook/departments/department[@id=$departmentId]/@title"/> 
+0

衛生署我嘗試使用一個變量,它沒有工作,但是,從複製粘貼您的例如,它確實。謝謝!:) – 2009-02-18 11:39:50

相關問題