查询 XML 具有长、多特殊字符、路径名的数据

Querying XML data with a long, multi special character, path name

刚刚开始使用 BaseX 的 XQuery。

我没有创建也无法控制的XML结构,看起来像这样:

2002test.xml:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:runSearchResponse xmlns:ns2="http://externalapi.business.footprints.numarasoftware.com/">
      <return>
        <_items>
          <_containerDefinitionId>1234</_containerDefinitionId>
          <_containerDefinitionName>Service Desk</_containerDefinitionName>
          <_itemDefinitionId>2244</_itemDefinitionId>
          <_itemDefinitionName>Service Request</_itemDefinitionName>
          <_itemId>9989</_itemId>
          <_itemFields>
            <itemFields>
              <fieldName>Icon Name</fieldName>
              <fieldValue>
                <value>default_ticket.png</value>
              </fieldValue>
            </itemFields>
            <itemFields>
              <fieldName>emailCustomerUpdate</fieldName>
              <fieldValue>
                <value>false</value>
              </fieldValue>
            </itemFields>
            <itemFields>
              <fieldName>bestContactNumber_Customer</fieldName>
              <fieldValue>
                <value/>
              </fieldValue>
            </itemFields>
          </_itemFields>
        </_items>
      </return>
    </ns2:runSearchResponse>
  </soap:Body>
</soap:Envelope>

做一个简单的:

for $x in doc("2002test.xml")
return $x

returns 我的整个文档都符合预期。

然而,任何深入研究的尝试对我来说都不起作用。

我试过:

for $x in doc("2002test.xml")/soap:Envelope/soap:Body/ns2:runSearchResponse/return
return $x/_items/itemFields/fieldName

但是长路径会抛出“没有为 'soap:Envelope' 声明的命名空间”。

所以我尝试这样声明路径:

declare variable $m := "/soap:Envelope/soap:Body/ns2:runSearchResponse/return";
for $x in doc("2002test.xml")//$m
return $x

这让我:

/soap:Envelope/soap:Body/ns2:runSearchResponse/return
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
...

我试过了:

for $x in doc("2002test.xml")/*[local-name()='soap:Envelope'][local-name()='soap:Body'][local-name()='ns2:runSearchResponse'][local-name()='return']
    
return $x

什么都没做。

很简单,我希望能够做这样的事情:

for $x in doc("2002test.xml")
where $x/return/_items/_itemFields/itemFields/fieldValue/value="default_ticket.png"
return $x/return/_items/_itemFields/itemFields/fieldName/text()

导致:

Icon Name

有什么建议吗?

使用带有谓词的基本 XPath 表达式,例如

doc("2002test.xml")//itemFields[fieldValue/value = "default_ticket.png"]/fieldName/text()

如果您认为需要 FLOWR 表达式,请使用例如

for $field in doc("2002test.xml")//itemFields
where $field/fieldValue/value = "default_ticket.png"
return $field/fieldName/text()