Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > доступ к узлу через document() и []


Автор: flashaa 23.9.2007, 12:40
Здравствуйте ! Такая трудность:

Разбираю свое дерево, в одном из узлов которого есть аттрибут @param = x, где x = a, b,c (для данного примера).
Есть ещё XML-документ, в котором хранятся, так сказать, адаптированные значения параметра param.

Код

<params>
    <a>Это значение а</a>
    <b>Это значение б</b>
    <c>Это значение с</c>
</params>


Мне нужно из этого документа получить строку "Это значение х" в зависимости от значения @param в моем дереве.

По идее, должно быть вот так:
Код

 Значение параметра param  - <xsl:value-of select="document('params.xml')/params/*[name() = ./@param]/."/>



Но вышеприведенный код не работает! 

Сейчас реализовано через перебор всех узлов в params:
Код

<xsl:variable name="param" select="./@param"/>
<xsl:for-each select="document('xml/params.xml')/params/*">
    <xsl:if test="name() = $param">
        <xsl:value-of select="."/>
    </xsl:if>
 </xsl:for-each>


Cогласитесь, нехорошо перебирать все, если нужен один элемент. Помогите.

Добавлено @ 12:45
Сам отвечаю на свой вопрос: скрестил два подхода и получилось работающее решение:

Код

<xsl:variable name="param" select="./@param"/>
Значение параметра param  - <xsl:value-of select="document('params.xml')/params/*[name() = $param"/>


Т.е. сравниваю с переменной, отсюда следует, что document(), либо [] меняют текущий узел

Автор: IZ@TOP 27.9.2007, 14:14
Для сравнений значений текущего узла (в контексте которого мы работаем) при обращении к другим узлам, необходимо использовать метод current:

Код

 <xsl:value-of select="document('params.xml')/params/*[name() = current()/@param]/."/>


Если я не ошибаюсь. А в вашем примере, условие будет выполнено в случае совпаления имени тега и атрибута @param в узле "document('params.xml')/params/*".
Вариант с переменной тоже вполне рабочий.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)