如何使用 xml-query 删除多个节点

How to delete more than one node with xml-query

使用此代码,我可以删除此 xml 元素的一个节点 (field_without_interest)。 但我现在想删除两个节点(field_without_interest 和 PERSON_NUMBER)。 我试图将 for 循环放在不同的地方(你可以在代码中看到这一点。但我认为在 Whosebug 中编写每次尝试都没有用)但无济于事。

SELECT XMLQUERY(
         'copy $NEWHTML := .
         modify (
           for $i in $NEWHTML/ROWSET/ROW/field_without_interest
           --for $j in $NEWHTML/ROWSET/ROW/PERSON_NUMBER
           return delete node $i--, node $j
         )
         return $NEWHTML'
         PASSING xmltype(
  '<?xml version="1.0"?> 
  <ROWSET> 
    <ROW>
      <PERSON_NUMBER>1000142</PERSON_NUMBER>
      <LOAN_1>25000</LOAN_1>
      <field_without_interest>f</field_without_interest>
    </ROW> 
    <ROW>
      <PERSON_NUMBER>1000142</PERSON_NUMBER>
      <LOAN_1>25000</LOAN_1>
    </ROW> 
  </ROWSET>'
)
         RETURNING CONTENT
       ).getStringVal() AS interested_elements
FROM   DUAL

code

您可以在 modify 子句中指定要删除的 select 个节点的替代路径:

SELECT XMLQUERY(
  'copy $NEWHTML := .
  modify (
    delete nodes
    $NEWHTML/ROWSET/ROW/*[
      self::field_without_interest
      or self::PERSON_NUMBER
    ]
  )
  return $NEWHTML'
  PASSING xmltype(
  '<?xml version="1.0"?> 
  <ROWSET> 
    <ROW>
      <PERSON_NUMBER>1000142</PERSON_NUMBER>
      <LOAN_1>25000</LOAN_1>
      <field_without_interest>f</field_without_interest>
    </ROW> 
    <ROW>
      <PERSON_NUMBER>1000142</PERSON_NUMBER>
      <LOAN_1>25000</LOAN_1>
    </ROW> 
  </ROWSET>'
)
  RETURNING CONTENT
  ).getStringVal() AS interested_elements
FROM   DUAL
| INTERESTED_ELEMENTS                                                                                      |
| :------------------------------------------------------------------------------------------------------- |
| <?xml version="1.0"?><ROWSET><ROW><LOAN_1>25000</LOAN_1></ROW><ROW><LOAN_1>25000</LOAN_1></ROW></ROWSET> |

db<>fiddle here