【问题标题】:fetch multiple attributes in xpath3在 xpath3 中获取多个属性
【发布时间】:2026-02-13 06:55:01
【问题描述】:

当该价格手册的货币为“GBP”时,我必须按名称“product-id”获取所有属性。使用 xpath 时,此表达式工作正常。但是当我使用 xpath3 时,它只返回第一个匹配值而不是所有值。我所需要的只是 xpath3 中 xpath 的等效表达式

工作 xpath 表达式

#[xpath:/pricebooks/pricebook[./header/currency ="GBP"]/price-tables/price-table/@product-id]

我试过的xpath表达式:

#[xpath3('/pricebooks/pricebook[./header/currency ="GBP"]/price-tables/price-table/@product-id',payload,'STRING')]强>

预期:[product1,product2,product4]

实际:product1

输入 XML:

<pricebooks>
 <pricebook>
    <header pricebook-id="GB">
        <currency>GBP</currency>
        <display-name>name1</display-name>
    </header>
    <price-tables>
        <price-table product-id="product1">
            <amount quantity="1">24.0</amount>
        </price-table>
    </price-tables>
 </pricebook>
 <pricebook>
    <header pricebook-id="NZ">
        <currency>GBP</currency>
        <display-name>name2</display-name>
    </header>
    <price-tables>
        <price-table product-id="product2">
            <amount quantity="1">38.00003</amount>
        </price-table>
    </price-tables>
 </pricebook>
 <pricebook>
    <header pricebook-id="US">
        <currency>USD</currency>
        <display-name>name3</display-name>
    </header>
    <price-tables>
        <price-table product-id="A215ZZ003">
            <amount quantity="1">28.0</amount>
        </price-table>
    </price-tables>
 </pricebook>
 <pricebook>
    <header pricebook-id="AU">
        <currency>GBP</currency>
        <display-name>name4</display-name>
    </header>
    <price-tables>
        <price-table product-id="product4">
            <amount quantity="1">30.0</amount>
        </price-table>
    </price-tables>
  </pricebook>
</pricebooks>

【问题讨论】:

  • 我不熟悉 mule,但是您的 xpath3() 参数似乎有冲突的引号,请尝试在您的 XPath 中使用双引号:'/pricebooks/pricebook[./header/currency ="GBP"]/price-tables/price-table/@product-id'
  • 我使用了双引号。抱歉在这里发错了。更新了。

标签: xml mule xpath-3.0


【解决方案1】:

看起来您尝试使用xpath3() 的第三个参数是错误的。尝试使用 NODESET 而不是 STRING,因为您的意思是返回多个节点。

引用自the documentation

  • BOOLEAN:将表达式的有效布尔值返回为java.lang.String。相当于将表达式包装在 XPath boolean() 函数的调用中。

  • STRING:返回表达式转换为字符串的结果,作为java.lang.String。相当于将表达式包装在对 XPath string() 函数的调用中。

  • NUMBER:以java.lang.Double的形式返回表达式转换为double的结果。相当于将表达式包装在 XPath number() 函数的调用中。

  • NODE:将结果作为节点对象返回。

  • NODESET:返回一个 DOM NodeList 对象。

【讨论】:

  • 将最后一个参数更改为 'NODESET' 无效。我猜这是选择后的返回类型。这里的问题是选择多个值本身
  • 选择很好,AFAICS。默认情况下,XPath 应该返回所有匹配的节点,即使在 XPath 3 中也是如此。这里有一个 XPath 3.0 演示:xpatheval.apphb.com/Dq0u8Rfx3
  • #[xpath3('//@product-id ')] 这个表达式也给出了单个值而不是所有匹配值
  • 我想这一定是 mule 的问题,因为表达式在你显示的评估器中工作正常。