Объединение узлов через XSL на основе условной логики - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть XML-документ, содержащий несколько элементов <item>. Внутри каждого может быть один или несколько следующих элементов: <list>, <listAfter> и <listBefore>. Таким образом, игнорируя множество посторонних элементов, это может выглядеть так:

<items>
  <item>
    <!-- ... various elements ... -->
    <list>Enhancements</list>
  </item>
  <item>
    <!-- ... various elements ... -->
    <listBefore>Enhancements</listBefore>
    <listAfter>Bugs</listAfter>
  </item>
  <item>
    <!-- ... various elements ... -->
    <list>Enhancements</list>
    <listAfter>Next Release</listAfter>
  </item>
  <item>
    <!-- ... various elements ... -->
    <listBefore>Bugs</listBefore>
  </item>
  <item>
    <!-- ... various elements ... -->
  </item>
</items>

Я хочу удалить все посторонние элементы <list*> и иметь один элемент <list> на <item>. Значение этого элемента должно следовать этой логике:

  • Используйте значение <list>, если оно доступно.
  • В противном случае используйте значение <listAfter>, если оно доступно.
  • В противном случае используйте значение <listBefore>, если оно доступно.
  • Если ни одно из этих полей не существует, используйте No List в качестве значения.

Используя мой XML-документ выше, я ожидаю, что результат будет выглядеть так:

<items>
  <item>
    <!-- ... various elements ... -->
    <list>Enhancements</list>
  </item>
  <item>
    <!-- ... various elements ... -->
    <list>Bugs</list>
  </item>
  <item>
    <!-- ... various elements ... -->
    <list>Enhancements</list>
  </item>
  <item>
    <!-- ... various elements ... -->
    <list>Bugs</list>
  </item>
  <item>
    <!-- ... various elements ... -->
    <list>No List</list>
  </item>
</items>

Кроме использования Identity Transform для копирования всех других элементов, я не уверен, как правильно включить эту логику. Как всегда, ваша помощь очень ценится.

1 Ответ

1 голос
/ 11 февраля 2012

Вы можете сделать это, переопределив шаблон идентификации и добавив дополнительные шаблоны, соответствующие критериям для различных элементов списка.

Чтобы соответствовать listAfter , которые вы хотите включить в вывод,Вы должны сделать следующее (например, listAfter элементов без элемента list в качестве родственного элемента)

<xsl:template 
   match="listAfter[not(preceding-sibling::list|following-sibling::list)]">

Для listBefore вам потребуетсясопоставлять их только в том случае, если у них нет ни списка , ни listAfter элементов в качестве родных элементов

<xsl:template 
  match="listBefore[not(
    preceding-sibling::list|following-sibling::list
    |preceding-sibling::listAfter|following-sibling::listAfter)]">

В других случаях вы игнорируете listAfter и listBefore elements:

<xsl:template match="listAfter|listBefore" />

Наконец, вы можете сопоставить элементы item с ни одним из различных элементов списка как дочерние элементы, например:

<xsl:template match="item[not(list|listAfter|listBefore)]">

Итак, с учетом следующего XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes" />

   <xsl:template match="listAfter[not(preceding-sibling::list|following-sibling::list)]">
      <list>
      <xsl:apply-templates select="@*|node()"/>
      </list>
   </xsl:template>

   <xsl:template match="listBefore[not(preceding-sibling::list|following-sibling::list|preceding-sibling::listAfter|following-sibling::listAfter)]">
      <list>
      <xsl:apply-templates select="@*|node()"/>
      </list>
   </xsl:template>   

   <xsl:template match="listAfter|listBefore" />

   <xsl:template match="item[not(list|listAfter|listBefore)]">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      <list>No List</list>
    </xsl:copy>
  </xsl:template>

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

Когда это применяется к вашему исходному XML, выводится следующее:

<items>
   <item>
      <!-- ... various elements ... -->
      <list>Enhancements</list>
   </item>
   <item>
      <!-- ... various elements ... -->
      <list>Bugs</list>
   </item>
   <item>
      <!-- ... various elements ... -->
      <list>Enhancements</list>
   </item>
   <item>
      <!-- ... various elements ... -->
      <list>Bugs</list>
   </item>
   <item>
      <!-- ... various elements ... -->
      <list>No List</list>
   </item>
</items>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...