我有以下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
元素中查找。但是,我不知道如何解决它。有人能给我一个提示吗?
答案 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"/>