Доступ к атрибуту текущего элемента в цикле в предикате - PullRequest
1 голос
/ 25 октября 2011

У меня есть для каждого я хочу отсортировать по некоторому значению.Но вещь, которую я зацикливаю, имеет только ключ, позволяющий установить связь со значением.Простой пример для документа:

<foo>
  <keys>
    <key id="foo"/>
    <key id="bar"/>
  </keys>

  <things>
    <thing name="foo"><desc>some description</desc></thing>
    <thing name="bar"><desc>another description</desc></thing>
  </things>
</foo>

И таблица стилей:

<xsl:for-each select="/foo/keys/key">
  <xsl:sort select="/foo/things/thing[@name=@id]"/>
  <xsl:value-of select="@id"/>
</xsl:for-each>

Это не похоже на работу.@id относится к элементу key из цикла;@name относится к thing из предиката.Как мне это решить?Я попытался присвоить /foo/keys/key/@id переменной и использовать ее, но <sort> должен быть первым элементом для каждого ...

1 Ответ

1 голос
/ 25 октября 2011

Использование current() Функция:

<xsl:sort select="/foo/things/thing[@name = current()/@id]"/>

Ссылка: http://www.w3.org/TR/xslt#misc-func

XML:

<foo>
    <keys>
        <key id="1"/>
        <key id="2"/>
        <key id="3"/>
        <key id="4"/>
    </keys>

    <things>
        <thing name="2">
            <desc>a</desc>
        </thing>
        <thing name="4">
            <desc>b</desc>
        </thing>
        <thing name="3">
            <desc>c</desc>
        </thing>
        <thing name="1">
            <desc>d</desc>
        </thing>
    </things>
</foo>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />


    <xsl:template match="/">
        <xsl:for-each select="/foo/keys/key">
            <xsl:sort select="/foo/things/thing[@name = current()/@id]"/>
            <xsl:value-of select="@id"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Выход:

2431
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...