Использование XPath для рефакторинга xml в кислороде

У меня есть XML-документ, который я пытаюсь реорганизовать и переформатировать. Я пытался использовать инструмент рефакторинга кислорода, чтобы обернуть определенные элементы или группу элементов. Но вместо того, чтобы группировать нужные элементы вместе, он просто оборачивает каждый соответствующий элемент по отдельности. Как мне написать выражение XPath, которое нацеливает и группирует элементы следующим образом:

Использование инструмента Wrap Element для объединения первых 3 элементов фрагмента в элемент s.

Исходя из этого:

 <system>
  <n>1057</n>
  <chunk>X1</chunk>
  <chunk>C6HF5</chunk>
  <chunk>Pentafluorbenzol</chunk>

  <chunk>C6H2F41,2,3,5-Tetrafluorbenzol</chunk>
  <chunk>Äquimolare Mischung: </chunk>
  <chunk/>
  <r>[F5]</r>
  <c>25°C</c>
  <chunk>ΔHM = 1,84 cal/mol Misch. = 7,7 J/mol Misch.</chunk>

К этому:

<system>
  <n>1057</n>
  <s><chunk>X1</chunk>
  <chunk>C6HF5</chunk>
  <chunk>Pentafluorbenzol</chunk></s>

  <chunk>C6H2F41,2,3,5-Tetrafluorbenzol</chunk>
  <chunk>Äquimolare Mischung: </chunk>
  <chunk/>
  <r>[F5]</r>
  <c>25°C</c>
  <chunk>ΔHM = 1,84 cal/mol Misch. = 7,7 J/mol Misch.</chunk>

Using the the XPath expression: /systems/system/chunk[position()<4] to select the first 3 chunk elements and enclose them with s tags. However when I run this in the refactoring command I get this:

<system>
  <n>1057</n>
  <s><chunk>X1</chunk></s>
  <s><chunk>C6HF5</chunk></s>
  <s><chunk>Pentafluorbenzol</chunk></s>

  <chunk>C6H2F41,2,3,5-Tetrafluorbenzol</chunk>
  <chunk>Äquimolare Mischung: </chunk>
  <chunk/>
  <r>[F5]</r>
  <c>25°C</c>
  <chunk>ΔHM = 1,84 cal/mol Misch. = 7,7 J/mol Misch.</chunk>

Where it selects the proper chunks, but wraps each chunk individually. Please let me know if you have any suggestions on how to group all elements together in s tags. Or if I shouldn't even be using oxygen xml to accomplish this.


person Marshall Bastien    schedule 02.08.2017    source источник
comment
Вы можете использовать таблицу стилей XSLT 3.0 с <xsl:mode on-no-match="shallow-copy"/><xsl:template match="system/chunk[1]"><s><xsl:copy-of select="., following-sibling::chunk[position() lt 3]"/></s></xsl:template><xsl:template match="system/chunk[2] | system/chunk[3]"/> для выполнения этого преобразования.   -  person Martin Honnen    schedule 02.08.2017


Ответы (1)


oXygen не имеет операции рефакторинга XML по умолчанию для того, что вам нужно. Но вы можете определить свою собственную операцию, если хотите (см. руководство пользователя oXygen). И вы можете использовать XSL Мартина Хоннена (первый комментарий к вашему сообщению) в качестве сценария операции.

person Sorin Adrian Carbunaru    schedule 10.08.2017