Biztalk XPath格式背后的推理
当您构建BRE词汇表并需要获取节点或值的XPath时,模式属性是一个方便的来源,但是这些XPath的格式有点不一致 比如Biztalk XPath格式背后的推理,xpath,biztalk,Xpath,Biztalk,当您构建BRE词汇表并需要获取节点或值的XPath时,模式属性是一个方便的来源,但是这些XPath的格式有点不一致 比如 <ns0:rootnode xmlns:ns0="http://mynamespace.org"> <ns0:childnode></ns0:childnode> </ns0:rootnode> 据我所知,对于每个节点,它匹配任何(*),那么在条件[]中扩展条件以缩小节点名和名称空间 我无论如何都不是xpath大师,但我猜
<ns0:rootnode xmlns:ns0="http://mynamespace.org">
<ns0:childnode></ns0:childnode>
</ns0:rootnode>
据我所知,对于每个节点,它匹配任何(*),那么在条件[]中扩展条件以缩小节点名和名称空间
我无论如何都不是xpath大师,但我猜这是对名称空间前缀更改的某种保护
但即使如此,为什么不缩短(和更干净)
我猜这是对名称空间前缀的某种保护
改变
实际上,这是BizTalk中使用的Xpath格式。这允许解析文档,而无需将名称空间加载到文档中。此外,local-name()
的使用不包括名称空间前缀(仅childnode
),而name()
也包括名称空间别名(例如ns0:childnode
)
因此,XPath
:
/*[local-name()='rootnode' and namespace-uri()='http://mynamespace.org']
/*[local-name()='childnode' and namespace-uri()='http://mynamespace.org']
可用于导航以下xml:
<rootnode xmlns='http://mynamespace.org'>
<childnode xmlns='http://mynamespace.org'>
..
</childnode>
</rootnode>
表示“使用元素名rootnode
和名称空间http://mynamespace.org
”,等等,功能如下
不幸的是:
/rootnode[namespace-uri()='http://mynamespace.org']
/childnode[namespace-uri()='http://mynamespace.org']
将不起作用,因为没有命名空间就无法计算/rootnode
快捷方式是可能的,但不明智,例如,如果您坚持xml文档中所有名称空间中只有一个rootnode
和childnode
元素,则可以省略namespace-uri()
,即
/*[local-name()='rootnode']/*[local-name()='childnode']
但是,如果您的文档看起来是这样的,则会出现这种情况:
<rootnode xmlns='http://mynamespace.org'>
<childnode xmlns='http://mynamespace.org'>
<childnode xmlns='http://anothernamespacehere'>
TL;DR
在我看来,在大多数情况下,命名空间无关的Xpath导航将在BizTalk中为您生成,您可以放心地将它们放在一边。尽管他们滔滔不绝,但过一会儿你就会习惯他们,不会真的被他们打扰
我猜这是对名称空间前缀的某种保护
改变
实际上,这是BizTalk中使用的Xpath格式。这允许解析文档,而无需将名称空间加载到文档中。此外,local-name()
的使用不包括名称空间前缀(仅childnode
),而name()
也包括名称空间别名(例如ns0:childnode
)
因此,XPath
:
/*[local-name()='rootnode' and namespace-uri()='http://mynamespace.org']
/*[local-name()='childnode' and namespace-uri()='http://mynamespace.org']
可用于导航以下xml:
<rootnode xmlns='http://mynamespace.org'>
<childnode xmlns='http://mynamespace.org'>
..
</childnode>
</rootnode>
表示“使用元素名rootnode
和名称空间http://mynamespace.org
”,等等,功能如下
不幸的是:
/rootnode[namespace-uri()='http://mynamespace.org']
/childnode[namespace-uri()='http://mynamespace.org']
将不起作用,因为没有命名空间就无法计算/rootnode
快捷方式是可能的,但不明智,例如,如果您坚持xml文档中所有名称空间中只有一个rootnode
和childnode
元素,则可以省略namespace-uri()
,即
/*[local-name()='rootnode']/*[local-name()='childnode']
但是,如果您的文档看起来是这样的,则会出现这种情况:
<rootnode xmlns='http://mynamespace.org'>
<childnode xmlns='http://mynamespace.org'>
<childnode xmlns='http://anothernamespacehere'>
TL;DR
在我看来,在大多数情况下,命名空间无关的Xpath导航将在BizTalk中为您生成,您可以放心地将它们放在一边。尽管他们唠叨不休,但过一会儿你就会习惯他们,不会真的为他们烦恼。是的,这很清楚。谢谢-知道这样做的原因就不会那么麻烦了。只需补充一点,如果可读性是一个问题,并且您不希望出现名称冲突(我从来没有遇到过),您可以删除名称空间谓词,它也会工作。是的,这很清楚。谢谢-知道这样做的原因就不那么麻烦了。只需补充一点,如果可读性是一个问题,并且您不希望出现名称冲突(我从未遇到过),您可以删除名称空间谓词,它也会起到同样的作用。