【发布时间】:2011-12-16 11:07:53
【问题描述】:
我有一个这样的 XSLT:
<?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 源。我发现的 very hacky 解决方法是这样的:
<xsl:for-each select="$root[1]">
<xsl:variable name="valueFromSource" select="xalan:evaluate($someXPathString)"/>
</xsl:for-each>
(无用的)for-each 循环将上下文更改回主 XML 源,因此 XPath 可以正确计算。但显然,这不是一个可接受的解决方案。
有没有办法做到这一点正确,或者有人可以提出更好的解决方法吗?
【问题讨论】: