Использование переменной как части выбора XPath - PullRequest
1 голос
/ 13 января 2012

Я хочу использовать переменную как часть выражения XPath.

Моя проблема может быть связана с функцией установки узла msxsl ... не уверен. Но не позволяйте этому рассуждать вашим суждениям ... читайте дальше ...

Я использую функцию .NET для загрузки файла контента, который передается через сделанный на заказ контент XML. @file приводит к XML-файлу.

Сделанный на заказ XML-код на странице выглядит следующим образом:

<control name="import" file="information.xml" node="r:container/r:group[@id='set01']/r:item[1]" />

XSL выглядит так:

<xsl:variable name="document">
    <xsl:copy-of select="ext:getIncludedContent(@file)" />
</xsl:variable>

Затем я перевожу это в набор узлов, чтобы я мог запросить документ

<xsl:variable name="preset-xml" select="msxsl:node-set($document)" />   

Исходный файл, в который я загружаю, выглядит следующим образом:

<container>
    <group id="set01">
        <item>value01</item>
        <item>value02</item>
        <item>value03</item>
    </group>
    <group id="set02">
        <item>value04</item>
        <item>value05</item>
    </group>                    
</container>

Это работает до этого момента. Я вижу исходный файл, который выводится и выводится в виде XML.

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

Я пробовал:

<xsl:value-of select="$preset-xml/@node" />

Очевидно, что это не работает, так как выглядит @node как прямой потомок загруженного в XML.

Я пробовал:

<xsl:variable name="node" select="@node" />
<xsl:value-of select="$preset-xml/$node" />

Но ему не нравится вторая переменная.

Я пробовал concat ($ preset-xml, '/', $ node), но в результате он все равно вытягивает весь документ.

Единственный способ, с помощью которого я могу сделать это сейчас, - выписать полное выражение в шаблоне:

<xsl:value-of select="$preset-xml/r:container/r:group[@id='set01']/r:item[1]" />

Что правильно приносит через value01

Но тогда это жестко закодированное решение. Я хочу разработать решение, которым можно манипулировать из контента, чтобы удовлетворить любой импортируемый контент, с параметрами, объявленными в файле контента.

p.s. Я использую XSLT 1.0, потому что технический администратор не будет изменять парсер Microsoft для поддержки более поздних версий XSL, поэтому любое решение должно быть написано с учетом этого.

1 Ответ

0 голосов
/ 15 февраля 2012

Нет функции, похожей на отражение в XSLT.Механизм MS XSLT, в частности, компилирует запросы XPath при загрузке XSLT, а не при применении к вашему XML-документу.Для этого есть причина: он отделяет код (XSLT) от данных (входной XML).

Чего вы пытаетесь достичь, смешивая код и данные;вы действительно должны выполнить произвольное выражение XPath из входного XML?Например, подумайте, что если пользователь передаст значение @name, равное, например, //*, и вы отправите на вывод содержимое всего входного XML-документа, который может содержать некоторые конфиденциальные данные.

Если вам действительно нужно сделать то, что вы описали, вы можете написать собственный объект расширения XSLT , который примет корень документа и запрос XPath и вернет последний, примененный к первому.Тогда вы сможете назвать его так:

<xsl:value-of select="myExtensionNs:apply-xpath($preset-xml, @node)"/>

Что касается вашей первоначальной попытки с concat($preset-xml,'/',$node), concat - это функция объединения строк.Вы предоставляете ему несколько аргументов, и он возвращает конкатенацию своих строковых представлений.Таким образом, concat($preset-xml,'/',$node) вернет строковое значение $preset-xml, объединенное с /, объединенное со строковым значением $ node.Если вы пытаетесь написать необходимый запрос XPath, concat('$preset-xml','/',$node) будет казаться более логичным (обратите внимание на кавычки);тем не менее, нет способа оценить полученную строку (например, $preset-xml/r:container/r:group[@id='set01']/r:item[1]) по значению соответствующего XPath-запроса;он может быть отправлен только на вывод.

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