代码之家  ›  专栏  ›  技术社区  ›  Rimas Kudelis

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

  •  1
  • Rimas Kudelis  · 技术社区  · 17 年前

    我有以下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 房地产 部门 元素,而不是 employee 要素然而,我不知道如何修复它。有人能给我一个提示吗?

    2 回复  |  直到 17 年前
        1
  •  3
  •   annakata    17 年前

    有很多种方法,但是一种很好的可重用方法是使用 key .

    定义:

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

    <employee> :

    <xsl:value-of select="key('dept', @department)/@title"/>
    
        2
  •  2
  •   jor    17 年前

    select中的{}不受支持,我更喜欢使用变量,但anotor选项将使用current()。但我可能只会使用以下内容:

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