xpath xml 根据兄弟值取第一个值

xpath xml take first value based on sibling value

我有一个 Logic 应用程序,用于在下面的 XML 显示中获取值。我需要获取包含“ID Change”文本的第一个 ws:Transaction_Entry_Moment,并且 ws:Is_Rescind_Or_Rescinded 值必须为“false”

<ws:Transaction_Log_Data>      
  <ws:Transaction_Log_Entry>
    <ws:Transaction_Log_Description>Change Contacts for: XYZ</ws:Transaction_Log_Description>
    <ws:Transaction_Entry_Moment>2020-11-05T20:25:58.439-08:00</ws:Transaction_Entry_Moment>
    <ws:Is_Rescind_Or_Rescinded>false</ws:Is_Rescind_Or_Rescinded>
  </ws:Transaction_Log_Entry>
  <ws:Transaction_Log_Entry>
    <ws:Transaction_Log_Description>ID Change: XYZ</ws:Transaction_Log_Description>
    <ws:Transaction_Entry_Moment>2020-11-05T20:25:58.439-08:00</ws:Transaction_Entry_Moment>
    <ws:Is_Rescind_Or_Rescinded>false</ws:Is_Rescind_Or_Rescinded>
  </ws:Transaction_Log_Entry>
  <ws:Transaction_Log_Entry>
    <ws:Transaction_Log_Description>ID Change: XYZ</ws:Transaction_Log_Description>
    <ws:Transaction_Entry_Moment>2020-11-05T20:25:58.439-08:00</ws:Transaction_Entry_Moment>
    <ws:Is_Rescind_Or_Rescinded>false</ws:Is_Rescind_Or_Rescinded>
  </ws:Transaction_Log_Entry>      
</ws:Transaction_Log_Data>

我在我的逻辑应用程序中使用了以下 xpath,它 returns 是空的

"DATE": "@xpath(xml(triggerBody()), 'string(/*[local-name()=\"Transaction_Log_Data\"]/*[local-name()=\"Transaction_Log_Entry\"]/*[local-name()=\"Is_Rescind_Or_Rescinded\" and .= \"false\" and contains(@*[local-name()=\"Transaction_Log_Description\"], \"ID Change\")][position() = 1]/../*[local-name()=\"Transaction_Entry_Moment\"])')"

如果我删除 xpath 中的包含,如下所示,它会获取第一个 ws:Is_Rescind_Or_Rescinded,它是“false”

"DATE": "@xpath(xml(triggerBody()), 'string(/*[local-name()=\"Transaction_Log_Data\"]/*[local-name()=\"Transaction_Log_Entry\"]/*[local-name()=\"Is_Rescind_Or_Rescinded\" and .= \"false\"][position() = 1]/../*[local-name()=\"Transaction_Entry_Moment\"])')"

我使用的内容有问题吗?实现此目标的正确方法是什么?

  1. @ 用于指向 属性 而不是元素
  2. 谓词应用于错误的元素

试试这个

'string(/*[local-name()=\"Transaction_Log_Data\"]/
   *[local-name()=\"Transaction_Log_Entry\" and contains(*[local-name()=\"Transaction_Log_Description\"], \"ID Change\")]/
      *[local-name()=\"Is_Rescind_Or_Rescinded\" and .= \"false\" ][position() = 1]/../
          *[local-name()=\"Transaction_Entry_Moment\"])'