Включение атрибута несвязанного элемента в XPath - PullRequest
1 голос
/ 18 февраля 2009

У меня есть следующий 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 ]

3 голосов
/ 18 февраля 2009

Множество способов, но неплохо многократно использовать клавишу .

Определение:

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

Использование (где текущий узел является <employee>:

<xsl:value-of select="key('dept', @department)/@title"/>
2 голосов
/ 18 февраля 2009

{} в select не поддерживаются, я предпочитаю использовать переменную, но другой вариант будет использовать current (). Но я бы, наверное, просто использовал что-то вроде:

<xsl:variable name="departmentId" select="@department" />
<xsl:value-of select="/phonebook/departments/department[@id=$departmentId]/@title"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...