【问题标题】:Xalan evaluate xpath with prefixXalan 使用前缀评估 xpath
【发布时间】:2014-03-28 14:23:20
【问题描述】:

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

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

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

我该如何声明这样的东西:

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

【问题讨论】:

  • 为什么前缀声明不能在 XSL 中?
  • 因为我有一个 XML,其中包含 Web 服务 (SOAP) 的结果以及应呈现为 HTML 表的元素。该元素类似于 **anyurl.com"><col name="description" element="ns:description"> ... **
  • 如果需要,您可以使用 //[local-name() = myNode][1] 跳过 XPath 中的命名空间。但通常您会在 XSLT 中处理名称空间。如果您发布完整的 XSL,此处的来源和输出人员可能会提出更好的解决方案。
  • 我不能使用它,因为可能存在同名的嵌套标签。示例:...。我应该带什么东西?
  • 您可以添加更多代码吗?

标签: java xml xslt xpath xalan


【解决方案1】:

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

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

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

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

    <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:evaluate 为您工作时所做的阅读和实验提供了一种用途,因此可以让您在同事和/或自己面前挽回面子。否则,将可在任何 XSLT 处理器中工作的代码替换为仅可在具有 evaluate 函数的处理器中工作的代码将是毫无意义的练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多