функция xquery для удаления новой строки из элемента xml - PullRequest
1 голос
/ 19 июня 2020

** когда я пытался присвоить большое строковое значение элементу 'x' с помощью сопоставления xquery, он создает новую строку. Вместо этого я хочу, чтобы она была без новой строки. **

<ABC> <X> 86E95A47AD2037B203521BBE7DAC71A11FE2DBD539D21CF66A9024B30505090F52F687F5BB299BD21A25E2ED01079A009B25FCFB7DCCBAF1DAB16E78B8CE179A922B94957989DBF531F967E46ACFB1B474A6F4CFD6AFB8C61D5BBB62346C502F837A68A15CD12ED90C03371EFB8C9922FB6B7860 </X> <Y>70406352</Y> </ABC>

Требование

<ABC> <X>86E95A47AD2037B203521BBE7DAC71A11FE2DBD539D21CF66A9024B30505090F52F687F5BB299BD21A25E2ED01079A009B25FCFB7DCCBAF1DAB16E78B8CE179A922B94957989DBF531F967E46ACFB1B474A6F4CFD6AFB8C61D5BBB62346C502F837A68A15CD12ED90C03371EFB8C9922FB6B7860</X> <Y>70406352</Y> </ABC>

1 Ответ

0 голосов
/ 19 июня 2020

Вы можете запустить его через рекурсивную функцию переключения типов со специальной обработкой для элемента X на normalize-space() на text() (или любую другую, более конкретную c замену ведущих символов возврата каретки:

Таргетинг конкретно на элемент X и его text():

declare function local:filter($nodes){
  for $node in $nodes 
  return
    typeswitch ($node)
      case text() return $node
      case attribute() return $node
      case comment() return $node
      case processing-instruction() return $node
      case element (X) return element {name($node)} {( $node/@*, $node/node() except $node/text(), $node/text()/normalize-space())}
      default return element {name($node)} {($node/@*, local:filter($node/node()))}
};

Или, в более общем смысле, normalize-space() для всех text() узлов:

declare function local:filter($nodes){
  for $node in $nodes 
  return
    typeswitch ($node)
      case text() return normalize-space($node)
      case attribute() return $node
      case comment() return $node
      case processing-instruction() return $node
      default return element {name($node)} {($node/@*, local:filter($node/node()))}
};
...