Группировка одинаковых элементов xml с использованием XSLT 2 - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть документ xml с повторяющимся элементом.Мне нужно привести соседние элементы div внутри другого элемента.Ниже мой XML-документ содержит элементы p и div.Все элементы div должны быть сгруппированы внутри подразделения .Если это один или с соседними.

   <doc>
    <section>
        <p class="h1">the fisr A</p>
        <p class="txt">one</p>
        <p>tow</p>
        <div>the sec B</div>
        <div>theree</div>
        <div>theree</div>
        <p class="h2">the sec sec B</p>
        <p class="txt">the next text</p>
        <p class="h3">the fisr C</p>
        <p class="txt">four</p>
        <div>five</div>
        <div>the seccond A</div>
        <p class="txt">the seccond txt</p>
        <p class="h2">the second B</p>
    </section>
    <section>
        <p class="txt">six</p>
        <div>seven</div>
        <p class="txt">eight</p>
        <p class="txt">nine</p>
    </section>
</doc>

Мне нужно привести смежные элементы div в одно деление родительского элемента.Ниже мой вывод.

   <doc>
    <section>
        <p class="h1">the fisr A</p>
        <p class="txt">one</p>
        <p>tow</p>
        <division>
            <div>the sec B</div>
            <div>theree</div>
            <div>theree</div>
        </division>
        <p class="h2">the sec sec B</p>
        <p class="txt">the next text</p>
        <p class="h3">the fisr C</p>
        <p class="txt">four</p>
        <division>
            <div>five</div>
            <div>the seccond A</div>
        </division>
        <p class="txt">the seccond txt</p>
        <p class="h2">the second B</p>
    </section>
    <section>
        <p class="txt">six</p>
        <division>
            <div>seven</div>
        </division>
        <p class="txt">eight</p>
        <p class="txt">nine</p>
    </section>
</doc>

Я попробовал следующее xslt.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" method="xml"/>
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="body">
    <xsl:copy>
      <xsl:for-each-group select="div" group-adjacent="div">
        <xsl:choose>
          <xsl:when test="current-grouping-key()">
            <division>
              <xsl:apply-templates select="current-group()"/>
            </division>
          </xsl:when>
          <xsl:otherwise>
            <xsl:apply-templates select="current-group()"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Пожалуйста, кто-нибудь, попробуйте мне помочь.

1 Ответ

0 голосов
/ 04 декабря 2018

У вас есть шаблон, соответствующий body, но в вашем XML нет элементов body.Вы, вероятно, имели в виду section здесь.

Для группировки вы должны действительно выбрать все элементы, а не просто div, а затем для смежной с группой вам нужно выражение, которое возвращает true, если элемент являетсяdiv или false.

Попробуйте это XSLT

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

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

  <xsl:template match="section">
    <xsl:copy>
      <xsl:for-each-group select="*" group-adjacent="boolean(self::div)">
        <xsl:choose>
          <xsl:when test="current-grouping-key()">
            <division>
              <xsl:apply-templates select="current-group()"/>
            </division>
          </xsl:when>
          <xsl:otherwise>
            <xsl:apply-templates select="current-group()"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...