什么是Coalesce运算符的XPath等价物?

Ric*_*ema 13 xpath

我有以下路径:

  • /我:公司/ NS1:审计/ NS1:访问/ NS1:customField10
  • /我:公司/ NS1:审计/ NS1:访问/ NS1:使用accountNumber

我想选择ns1:customField10,如果它不为空,否则我想返回ns1:accountNumber.

我尝试了以下方法:

xml.SelectSingleNode(
    "(/my:cobius/ns1:Audit/ns1:Visit/ns1:customField10 | 
    /my:cobius/ns1:Audit/ns1:Visit/ns1:accountNumber)", ns)
Run Code Online (Sandbox Code Playgroud)

但它始终返回accountNumber.我尝试翻转customField10和accountNumber的顺序,但没有快乐.它仍然返回accountNumber.

如何在XPath中执行等效的coalesce运算符?

更新:

这是最终的代码:

xml.SelectSingleNode(
    "(/my:company/ns1:Audit/ns1:Visit/ns1:customField10[normalize-space()] | 
    /my:company/ns1:Audit/ns1:Visit/ns1:accountNumber[not(normalize-space(../ns1:customField10))])", ns)
Run Code Online (Sandbox Code Playgroud)

Luc*_*ero 5

如果节点丢失,您的代码将起作用(类似于SQL中的NULL).但是不会丢失空(就像SQL中的空字符串).

你当然可以添加一个谓词:

/my:cobius/ns1:Audit/ns1:Visit/ns1:customField10[string-length(.)] | /my:cobius/ns1:Audit/ns1:Visit/ns1:accountNumber
Run Code Online (Sandbox Code Playgroud)

  • `|` 不是某种短路逻辑或。这是一个工会运营商。换句话说,如果两者都存在,你就会得到两者,这不是OP想要的。 (2认同)
  • OP正在执行`SelectSingleNode`,它返回集合的第一个节点.因此,集合包含两个节点都不是问题.但是,我应该提到一个警告:代码期望`customField10`在文档中的`accountNumber`之前,因为union运算符按文档顺序返回节点. (2认同)