我想得到针对以下数据起草的xquery转换..这里作为服务响应错误的一部分,我得到了低于有效负载并且需要捕获ErrorCode元素中的数据。
我在这里遇到的挑战是,这不是XML结构的一部分,它是CDATA标签的一部分。请您建议我如何在变量中得到这个值。
假设我将此结构作为$ Fault的一部分,现在需要在新变量$ FaultCode中分配ErrorCode
$ FaultCode = $ Fault / con:details / con1:ErrorResponseDetail / con1:detail / ********
我不确定如何捕获这个更详细的元素
<con:fault xmlns:con="http://www.bea.com/wli/sb/context">
<con:errorCode>382502</con:errorCode>
<con:reason>eceived an error response</con:reason>
<con:details>
<con1:ErrorResponseDetail xmlns:con1="http://www.bea.com/wli/sb/stages/transform/config">
<con1:detail>
<![CDATA[<Error xmlns="http://servic.abcd.net/V1">
<ErrorCode>DATA_AVAILABILITY</ErrorCode>
<ErrorDescription>{"description":"No Cdata for )"}</ErrorDescription>
</Error>]]></con1:detail>
<con1:http-response-code>404</con1:http-response-code>
</con1:ErrorResponseDetail>
</con:details>
<con:location>
<con:node>TestPPNode</con:node>
<con:pipeline>TestPPNode_request</con:pipeline>
<con:stage>Test Stage</con:stage>
<con:path>request-pipeline</con:path>
</con:location>
</con:fault>
答案 0 :(得分:1)
假设XQuery 3.1带有parse-xml
函数(https://www.w3.org/TR/xpath-functions/#func-parse-xml),您可以使用
declare namespace con="http://www.bea.com/wli/sb/context";
declare namespace con1="http://www.bea.com/wli/sb/stages/transform/config";
declare namespace V1 = "http://servic.abcd.net/V1";
/con:fault/con:details/con1:ErrorResponseDetail/con1:detail!parse-xml(.)/V1:Error/V1:ErrorCode/data()
获取字符串值DATA_AVAILABILITY
,请参阅https://xqueryfiddle.liberty-development.net/6qM2e27了解演示。
使用XQuery 1,没有正确解决此问题的XML解析,但您当然可以尝试使用字符串函数来提取数据,例如。
/con:fault/con:details/con1:ErrorResponseDetail/con1:detail/substring-before(substring-after(., '<ErrorCode>'), '</ErrorCode>')