2011-07-26 35 views
2

不知道这是否可行,但尝试设置一些不需要在从动态创建的节点块中提取值时必须键入exslt:node-set的东西。我将整个节点集合存储在一个变量中,并将其包装在exslt:node-set中,但为什么当我试图从它中取出时它不起作用。这可能吗?自动化exslt:节点集?

<xsl:variable name="LANG"> 
    <xsl:variable name="tmp"> 
     <xsl:element name="foo"> 
      <xsl:element name="bar">Hello</xsl:element> 
     </xsl:element> 
    </xsl:variable> 
    <xsl:value-of select="exslt:node-set($tmp)"/> 
</xsl:variable> 


<!-- Love to be able to do this --> 
<xsl:value-of select="$LANG/foo/bar"/> 

<!-- This does work --> 
<xsl:value-of select="exslt:node-set($LANG)/foo/bar"/> 

回答

2

在XSLT 1.0,其定义为在您的示例变量被称为结果树片段(RTF)和只能使用xsl:copy-of整个片段复制到结果树或xsl:value-of复制整个内容为。例如

<xsl:copy-of select="$LANG"/> 

如果你想治疗变量作为一个临时的树,你需要的node-set()扩展。

在XSLT 1.0中处理静态树碎片(如查找表)的常用方法是将它们定义为样式表根元素的子元素(使用自定义命名空间)。然后你可以使用document()函数来检索想要的值。

注意如果您正在使用撒克逊(V> 6.5),你可以简单地设置样式版本1.1,你将能够管理的RTF没有任何节点集扩展。


[XSLT 1.0]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:empo="http://stackoverflow.com/users/253811/empo"> 

    <empo:LANG> 
     <empo:foo> 
      <empo:bar>Hello</empo:bar> 
     </empo:foo> 
    </empo:LANG> 

    <xsl:template match="/"> 
     <xsl:variable name="LANG" select="document('')/*/empo:LANG"/> 
     <xsl:value-of select="$LANG/empo:foo/empo:bar"/> 
    </xsl:template> 

</xsl:stylesheet>