在我的XSLT中,我有这个评估声明:
<xsl:value-of select="xalan:evaluate('//ns:myNode[1]')"/>
但是ns
前缀声明不能在XSLT中,但它在输入XML中。
我如何声明这样的内容:
<xsl:declare-namespace prefix="ns" select="/configuration/@myNamespace"/>
答案 0 :(得分:0)
问题在某些细节上含糊不清,所以这个答案可能正在解决一个完全不同的问题。我猜想
如果(正如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
函数的处理器中起作用的代码时,这是毫无意义的练习。