mule xpath表达式未返回节点

mule xpath表达式未返回节点,xpath,mule,Xpath,Mule,我试图在Mule流中使用xpath,根据Mule变量中元素Stage的当前值选择元素Host下的属性“value” 以下是XML资源文件feedHosts.XML <?xml version="1.0"?> <FeedHosts xmlns:bar="http://www.bar.org" xmlns:foo="http://www.foo.org/"> <Host value="host1.com">

我试图在Mule流中使用xpath,根据Mule变量中元素Stage的当前值选择元素Host下的属性“value”

以下是XML资源文件feedHosts.XML

    <?xml version="1.0"?>
    <FeedHosts xmlns:bar="http://www.bar.org" xmlns:foo="http://www.foo.org/">
         <Host value="host1.com">
             <Stage>qa</Stage>
         </Host>
         <Host value="host2.com">
             <Stage>dev</Stage>
         </Host>
         <Host value="host3.com">
              <Stage>live</Stage>
         </Host>
     </FeedHosts> 
我试过一些方法,比如

    <set-payload value="#[groovy: getClass().getResourceAsStream('/feedHosts.xml')]" doc:name="Set Payload to feedHosts.xml"/>
    <byte-array-to-string-transformer doc:name="Byte Array to String"/>
    <mulexml:xpath-extractor-transformer name="whatever" expression="/FeedHosts/Host[Stage='#[flowVars.stage]']" resultType="NODE"/>
    <logger message="#[payload]" level="INFO" doc:name="Logger"/>
这会将feedHosts.xml加载到负载中,但xpath提取器转换器本身会返回空负载。显然,它不会返回我想要的value属性


感谢您的帮助。

XPath位置路径包含几个提供上下文的步骤。最后一个选择数据

表达式的最后一步选择/FeedHosts上下文中的一组所有主机元素。谓词将该集合限制为具有包含[flowVars.Stage]返回的文本的Stage子元素的集合

我不熟悉Mule变量插值语法。假设值[flowVars.stage]实际生成一个字符串qa、dev或live,它应该选择一个主机元素

但是您说您实际上希望根据元素Stage的当前值选择元素Host下的属性“value”。在这种情况下,最后一步应该在属性轴中,主机集只是您的上下文。您需要添加一个额外的步骤:

/FeedHosts/Host[Stage=#[flowVars.stage]]/@value

对于上面的插值语法,我参考了

这个示例返回所需的节点和属性,并通过表达式转换器执行查询。xpath提取器转换器表达式将不接受该字符,但表达式转换器将接受该字符

<set-payload value="#[groovy: getClass().getResourceAsStream('/hostsfile.xml')]" />
<set-variable variableName="myXPath" value="/FeedHosts/Host[Stage='#[stage]']/@value" />

<enricher target="#[flowVars.host]" doc:name="Message Enricher">
     <expression-transformer expression="#[xpath(myXPath).value]" />
</enricher>

<logger message="host is #[host]" level="INFO" doc:name="Logger"/>

由于XML有与其关联的名称空间,因此需要使用Mule名称空间管理器使用Xpath提取值 docs/display/current/XML+名称空间 例如:

<mulexml:namespace-manager includeConfigNamespaces="true">
   <mulexml:namespace prefix="foo" uri="http://www.foo.org/"/>
   <mulexml:namespace prefix="bar" uri="http://www.bar.org"/>
</mulexml:namespace-manager> 
然后可以在Xpath中获取值,

输出是什么?[flowVars.stage]是字符串“qa”,我不熟悉Mule如何插值变量。我以为[…]是那样工作的。flowVars.stage从何而来?它是类似于[/FeedHosts/Host[Stage=flowVars.Stage]]/@value]还是有一些语法可以将参数传递给表达式。阅读示例请参阅第5节-使用XPath,似乎必须将各个XPath表达式分配给mule变量,因此当您获得变量时,您的XPath表达式是performedIt的Mule似乎不支持字符串插值,但在XPath表达式中似乎应该支持。因此有两种选择:1如果有,您可以尝试删除撇号:/FeedHosts/Host[Stage=[flowVars.Stage]]/@value。2如果这不起作用,您可能可以改用字符串连接:/FeedHosts/Host[Stage='+flowVars.Stage+']/@value。不幸的是,我现在不能在这里测试。如果这些解决方案中有任何一个有效,请告诉我,我将编辑答案。我从中获得了有关串联策略的信息,我将使用[Stage='+flowVars.Stage+']进行最后一次尝试。我从另一个答案中获得了该信息,但我不太明白为什么