У меня есть XSLT, как это:XSLT: XPath контекст и документ()
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan">
<xsl:variable name="fooDocument" select="document('fooDocument.xml')"/>
<xsl:template match="/">
<xsl:apply-templates select="$fooDocument//*"/>
</xsl:template>
<xsl:template match="nodeInFooDocument">
<xsl:variable name="valueFromSource" select="//someSourceElement"/>
</xsl:template>
</xsl:transform>
Во втором шаблоне, который соответствует узлов в fooDocument.xml
, который загружается с document()
, я хочу, чтобы получить доступ к узлам в XML источник преобразование выполняется. Это не работает с //someSourceElement
, потому что, по-видимому, XPath выполняет этот путь в контексте fooDocument.
Первое решение, которое приходит на ум, это:
...
<!-- global variable -->
<xsl:variable name="root" select="/"/>
...
<!-- in the template -->
<xsl:variable name="valueFromSource" select="$root//someSourceElement"/>
...
Но я не могу использовать этот обходной путь, потому что на самом деле, моя переменная выбирается так:
<xsl:variable name="valueFromSource" select="xalan:evaluate($someXPathString)"/>
$someXPathString
не обработаны в файл XSLT, но загружается из fooDocument (и содержит абсолютный путь, как тот, который использовался выше). Тем не менее, мне нужно как-то изменить XPath-контекст обратно на источник XML. очень Hacky обходной путь я нашел это:
<xsl:for-each select="$root[1]">
<xsl:variable name="valueFromSource" select="xalan:evaluate($someXPathString)"/>
</xsl:for-each>
The (бесполезно) for-each
цикл изменяет контекст обратно к основному источнику XML, таким образом, XPath оценивает правильно. Но, очевидно, это не приемлемое решение.
Есть ли способ сделать это право, или может кто-нибудь предложить лучшее обходное решение?
Я согласен с тем, что для каждого - прекрасный способ изменить контекстный документ (если несколько неинтуитивно понятный), но, конечно же, Мартин, вы не имеете в виду, что другого пути нет. Например. 'apply-templates select =" $ root "' (с режимом или без него) также будет устанавливать контекстный документ, правильно? – LarsH
Я не нашел другого возможного способа изменить контекстный документ. – flyx