私はこのようなXSLT持っている:document()
がロードされているfooDocument.xml
内のノードと一致する2番目のテンプレートでは、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>
を、私はXML内のノードにアクセスしたいです変換が実行されるソース。明らかに、XPathはfooDocumentのコンテキストでこのパスを実行するので、これは//someSourceElement
では機能しません。
心に来る最初の回避策はこれです:
...
<!-- 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
<xsl:for-each select="$root[1]">
<xsl:variable name="valueFromSource" select="xalan:evaluate($someXPathString)"/>
</xsl:for-each>
(役に立たない)for-each
ループは、このようXPathは正しく評価し、バックメインXMLソースにコンテキストを変更します。私が見つけ非常ハック回避策は、このです。しかし明らかに、これは容認できる解決策ではありません。
これを行う方法はありますか右、または誰かがより良い回避策を提案できますか?
私はのために、各コンテキスト文書(やや非直観的な場合)を変更するための細かい方法であることに同意、しかし確実にマーティンは、あなたは他の方法がないことを意味するものではありません。例えば。 'apply-templates select =" $ root "'(モードの有無にかかわらず)文脈文書を設定するでしょうか? – LarsH
私は文脈文書を変更する他の実現可能な方法を見つけませんでした。 – flyx