我试图在Mule流程中使用xpath来选择属性' value' under element主机基于元素Stage的当前值(将在Mule变量中)
这是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-extractor-transformer本身会返回null有效负载。显然它不会返回我想要的值属性。
任何帮助表示感谢。
答案 0 :(得分:2)
XPath位置路径包含几个提供上下文的步骤。最后一个选择数据。
表达式的 last 步骤在Host
的上下文中选择一组所有/FeedHosts
元素。谓词将该集限制为具有包含Stage
返回的文本的#[flowVars.stage]
子元素的集合。
我不熟悉 Mule 变量插值语法。 假设值#[flowVars.stage]
实际生成其中一个字符串qa
,dev
或live
,它应该选择其中一个Host
元素。
但是你说你实际上想要&#34;根据元素Stage&#34的当前值,在元素Host下选择属性&#39; <&#39; ; < / em>的。在这种情况下,最后一步应该在属性轴中,Hosts
集只是您的上下文。您需要添加一个额外的步骤:
/FeedHosts/Host[Stage=#[flowVars.stage]]/@value
对于上面的插值语法,我提到了this reference
答案 1 :(得分:0)
此示例返回所需的节点和属性(感谢helderdarocha),并通过表达式变换器执行查询。 xpath-extractor-transformer表达式不接受#字符,但表达式变换器将会。
<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"/>
答案 2 :(得分:0)
由于XML具有与之关联的命名空间,因此您需要使用Mule命名空间管理器使用Xpath提取值
https://developer.mulesoft.com/
文档/显示/电流/ 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中获取值, https://developer.mulesoft.com/docs/display/current/XML+Module+Reference