как исключить родительский элемент и узлы подэлемента - PullRequest
1 голос
/ 06 мая 2020

Как исключить элементы «Approach» и «Amount1». Я могу исключить «Amount1», но не могу удалить оба узла (Approach, Amount1).

Sample. xml:

<root>
  <Approach> Approach </Approach>
  <Progress> Progress </Progress>
  <Objective> Objective </Objective>
  <fundingSources>
     <Source>
         <Amounts>
             <Amount1>thousands</Amount1>      
             <Amount2>millions</Amount2> 
        </Amounts>
    </Source>
  </fundingSources>
</root>

Я могу удалить узел Amount1, выполнив следующее fn: do c ("sample. xml") // * [not ((потомок-или-self :: Amount1))]

возврат результата:

<root>
  <Approach> Approach </Approach>
  <Progress> Progress </Progress>
  <Objective> Objective </Objective>
  <fundingSources>
     <Source>
         <Amounts>
             <Amount2>millions</Amount2> 
        </Amounts>
    </Source>
  </fundingSources>
</root>

Но изо всех сил пытаются объединить имя другого родительского узла "Подход", чтобы его опустить. Спасибо.

1 Ответ

1 голос
/ 07 мая 2020

Вам нужен рекурсивный подход. XSLT подойдет для этого, но вы также можете сделать это с помощью XQuery следующим образом:

xquery version "1.0-ml";

declare function local:filter(
  $nodes as node()*
)
  as node()*
{
  for $node in $nodes
  return typeswitch ($node)
    case element(Approach) return ()
    case element(Amount1) return ()
    case element()
    return element { node-name($node) } {
      $node/@*,
      local:filter($node/node())
    }
    case document-node()
    return document {
      local:filter($node/node())
    }
    default return $node
};

let $xml := <root>
  <Approach> Approach </Approach>
  <Progress> Progress </Progress>
  <Objective> Objective </Objective>
  <fundingSources>
     <Source>
         <Amounts>
             <Amount1>thousands</Amount1>      
             <Amount2>millions</Amount2> 
        </Amounts>
    </Source>
  </fundingSources>
</root>
return
  local:filter($xml)

HTH!

...