在XPath中包含不相关元素的属性

时间:2009-02-18 11:23:34

标签: xslt xpath

我有以下XML文件:

<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="daffy.duck@example.com" department="2" room="" />
        <employee id="2" fname="Bugs" lname="Bunny" title="Programmer" email="bugs.bunny@example.com" 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元素中查找。但是,我不知道如何解决它。有人能给我一个提示吗?

2 个答案:

答案 0 :(得分:3)

很多方法,但一个很好的可重用方法是使用key

定义:

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

用法(当前节点为<employee>

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

答案 1 :(得分:2)

不支持select中的{},我更喜欢使用变量,但另一个选项是使用current()。但我可能会使用类似的东西:

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