Шаблон XSLT - Добавить или удалить узлы условно - PullRequest
0 голосов
/ 02 ноября 2018

Вот что мне нужно сделать:

  1. Если существует дочерний элемент 2 и дочерний элемент 3, мне нужно создать узел <child1.5> после дочернего элемента 1 и удалить дочерний элемент 2
  2. Если ребенка 3 не существует, мне нужно превратить ребенка 2 в ребенка 3

Исходный документ

<parent>
  <child1>
  </child1>
  <child2>
  </child2>
 </parent>
<parent>
  <child1>
  </child1>
  <child2>
  </child2>
  <child3>
  </child3>
</parent>

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать следующий набор стилей / шаблонов:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="parent[child2 and child3]">
    <xsl:copy>
      <xsl:copy-of select="child1"/>
      <child1.5>
        Content
      </child1.5>
      <xsl:copy-of select="child3"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="parent[child2 and not(child3)]">
    <xsl:copy>
      <xsl:copy-of select="child1"/>
      <child3>
        <xsl:value-of select="child2" />
      </child3>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Вывод (с элементом root, который делает ваш XML правильно сформированным ):

<?xml version="1.0"?>
<root>
    <parent><child1>
        </child1>
        <child3>
        </child3>
    </parent>
    <parent><child1>
        </child1>
        <child1.5>
            Content
        </child1.5>
        <child3>
        </child3>
    </parent>
</root>
...