你期望这个有用吗? (似乎你不能在动态创建的元素上使用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时“无效类型”;从“数据”之前删除“$”将使错误消失,但显然不能做到所需,因为它会尝试匹配XSLT正在运行的XML文档中的data / fu / bar。
答案 0 :(得分:3)
您可以将document()
函数与空字符串值一起使用,以便引用进行函数调用的样式表的根节点。然后,使用XPath选择您想要的内容。
因此,不要在select中引用$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 :(得分:1)
对此没有任何简单的答案,但“方法”是使用node-set()函数。但它在技术上并不是XSLT 1.0的一部分,因此不一定受所有转换引擎的支持。有关详细信息,请参阅此链接:http://www.xml.com/pub/a/2003/07/16/nodeset.html
基本上,$ data是一个字符串,而不是树,所以你需要一个特殊的函数来将它转换成树。这就是为什么你得到“无效类型” - 数据类型不匹配。
答案 2 :(得分:0)
您的代码在XSLT 2.0中可以正常工作,但在XSLT 1.0中却不行。在XSLT 1.0中,不允许使用路径表达式导航到结果树片段;通常的解决方法是exslt:node-set()扩展函数。