在XSLT中,您可以在动态创建的元素上使用XPath吗?

时间:2011-07-20 20:16:30

标签: php xslt xpath

你期望这个有用吗? (似乎你不能在动态创建的元素上使用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。

3 个答案:

答案 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()扩展函数。