В XSLT вы можете использовать XPath на динамически создаваемых элементах? - PullRequest
2 голосов
/ 21 июля 2011

Вы ожидаете, что это сработает или нет?(кажется, вы не можете использовать XPath на динамически создаваемых элементах, возможно, потому, что они не в магии «за кадром», используемой для повышения производительности XPath)

<?xml version="1.0" encoding="UTF-8"?>

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

  <xsl:template match="/">

    <xsl:variable name="data">
      <fu><bar>Test</bar></fu>
    </xsl:variable>

    Value: <xsl:value-of select="$data/fu/bar" />

  </xsl:template>

</xsl:stylesheet>

Я получаю ошибку вXSLT-процессоры, которые я пробовал, например, «неверный тип» при использовании PHP5;удаление «$» из ранее «data» устранит ошибку, но, очевидно, не сделает то, что нужно, поскольку попытается сопоставить data / fu / bar из XML-документа, с которым запускается XSLT.

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Вы можете использовать функцию document() с пустым строковым значением, чтобы ссылаться на корневой узел таблицы стилей, из которого был сделан вызов функции.Затем используйте XPath, чтобы выбрать то, что вы хотите.

Итак, вместо ссылки на переменную $data в выборе, используйте следующий XPath:

document('')/xsl:stylesheet/xsl:template[@match='/']/xsl:variable[@name='data']/fu/bar

Применимо к вашему XSLT:

  <xsl:template match="/">

    <xsl:variable name="data">
      <fu><bar>Test</bar></fu>
    </xsl:variable>

    Value: <xsl:value-of 
         select="document('')/xsl:stylesheet
                   /xsl:template[@match='/']/xsl:variable[@name='data']/fu/bar" />

  </xsl:template>

</xsl:stylesheet>
1 голос
/ 21 июля 2011

На этот вопрос нет простых ответов, но «способ» сделать это - с помощью функции node-set (). Но технически он не является частью XSLT 1.0 и поэтому не обязательно поддерживается всеми механизмами преобразования. Смотрите эту ссылку для получения дополнительной информации: http://www.xml.com/pub/a/2003/07/16/nodeset.html

По сути, $ data - это строка, а не дерево, поэтому вам нужна специальная функция для преобразования ее в дерево. Вот почему вы получаете «неверный тип» - несоответствие типов данных.

0 голосов
/ 21 июля 2011

Ваш код будет хорошо работать в XSLT 2.0, но не в XSLT 1.0.В XSLT 1.0 вам не разрешено использовать выражения пути для перехода к фрагменту результирующего дерева;обычный обходной путь - функция расширения exslt: node-set ().

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