Xalan用前缀评估xpath

时间:2014-03-28 14:23:21

标签: java xml xslt xpath xalan

在我的XSLT中,我有这个评估声明:

<xsl:value-of select="xalan:evaluate('//ns:myNode[1]')"/>

但是ns前缀声明不能在XSLT中,但它在输入XML中。

我如何声明这样的内容:

<xsl:declare-namespace prefix="ns" select="/configuration/@myNamespace"/>

1 个答案:

答案 0 :(得分:0)

问题在某些细节上含糊不清,所以这个答案可能正在解决一个完全不同的问题。我猜想

  • 您的样式表将处理输入数据,这些数据的确切形式未提前完整指定。
  • 要显示为表的元素的名称空间名称和本地名称不是预先知道的,而是作为您正在处理的文档的一部分(如您所说,从SOAP服务器返回)。 (这是我无法在XSLT中声明相关命名空间的唯一合理原因。如果您有其他原因,请解释。)

如果(正如OP对aryn.galadar的回应所建议的那样)输入文档指定/list/@namespace-prefix中所有相关元素的名称空间前缀,/list/@namespace中所有相关元素的名称空间名称,以及/list/col/@element中所有相关元素的QName,然后有几种方法可以检索所有相关元素(或者,如示例代码中所示,第一个这样的元素)并获取其值:

  • 搜索具有给定名称的元素:

    <xsl:variable name="element-name"
                  select="/list/col/@element"/>
    <xsl:value-of 
      select="//*[name() = $element-name][1]"/>
    
  • 搜索具有给定本地名称和所需命名空间的元素;这可以保护您免受关键元素实际上不使用广告前缀的情况的影响,如果您不需要这样的保护则毫无意义:

    <xsl:variable name="local-name"
      select="substring-after(/list/col/@element, ':')"/>
    <xsl:variable name="ns-name"
      select="/list/@namespace"/>
    <xsl:value-of 
      select="//*
        [namespace-name() = $ns-name]
        [local-name() = $local-name]
        [1]"/>
    
  • 创建合适的XPath表达式并对其进行评估:

    <xsl:variable name="expr"
      select="concat('//', 
                     /list/col/@element,
                     '[1]')"/>
    <xsl:value-of 
      select="xalan:evaluate($expr)"/>
    

    这种方法的唯一优势在于它提供了在尝试制作xalan时所做的阅读和实验的用途:为您评估工作,从而使您可以与同事和/或自己保存面子。否则,在使用可在任何XSLT处理器中运行的代码并将其替换为仅在具有evaluate函数的处理器中起作用的代码时,这是毫无意义的练习。