2009-02-18 36 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

相关问题