XSLT Как мне обернуть каждые 3 элемента div? - PullRequest
3 голосов
/ 09 апреля 2011

У меня есть некоторый XML-документ с <item> элементами, и я бы хотел обернуть каждый из них в <div> Если есть менее 3 элементов, оберните их тоже.

<shop>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  .....
  <item></item>
</shop>

Поэтому результат должен быть примерно таким:

<div class="line">
  <item></item>
  <item></item>
  <item></item>
</div>
<div class="line">
  <item></item>
  <item></item>
  <item></item>
</div>
....
<div class="line">
  <item></item>
  <item></item>
</div>

Ответы [ 4 ]

1 голос
/ 09 апреля 2011
  <xsl:for-each select"item">
    <xsl:choose>
      <xsl:when test="count(item) mod 3 = 0">
      </xsl:when>
      <xsl:otherwise>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:foreach>

Я не пробовал этого, но важным является тест в цикле foreach.count(item) mod 3 = 0, чем вы можете реагировать каждый третий раз.

1 голос
/ 09 апреля 2011

Следующая таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!--  the number of items to include in each group -->
    <xsl:variable name="group" select="3" />
    <xsl:template match="/">
        <xsl:apply-templates
            select="shop/item[position() mod $group = 1]" />
    </xsl:template>
    <xsl:template match="item" mode="inner">
        <!-- handle items appropriately here -->
        <item/>
    </xsl:template>
    <xsl:template match="item">
        <div class="line">
            <xsl:apply-templates
                select=".|following-sibling::item[position() &lt; $group]"
                mode="inner" />
        </div>
    </xsl:template>
</xsl:stylesheet>

Применяется к этому входу:

<shop>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
  <item></item>
</shop>

Производит:

<div class="line">
    <item />
    <item />
    <item />
</div>
<div class="line">
    <item />
    <item />
    <item />
</div>
<div class="line">
    <item />
    <item />
    <item />
</div>
<div class="line">
    <item />
    <item />
    <item />
</div>
<div class="line">
    <item />
    <item />
</div>
1 голос
/ 09 апреля 2011

Возможно, ваше решение будет очень похоже на это:

Таблица HTML с чередующимися цветами строк через XSL

0 голосов
/ 09 апреля 2011

Гораздо более простое решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="item[position() mod 3 = 1]">
  <div>
   <xsl:copy-of select=
    ".|following-sibling::*[not(position() > 2)]"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<shop>
    <item></item>
    <item></item>
    <item></item>
    <item></item>
    <item></item>
    <item></item>      
    <item></item>
</shop>

производиттребуемый, правильный результат :

<div>
   <item/>
   <item/>
   <item/>
</div>
<div>
   <item/>
   <item/>
   <item/>
</div>
<div>
   <item/>
</div>

Обновление :

ОП пояснил, что ему нужно преобразование, которое обработало бы документ XML на эта страница .Все должно быть скопировано как есть, за исключением любой группы <item> элементов, которые должны быть сгруппированы по три, и каждая группа должна быть заключена в <div>.

Вот код для этого:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="node()[self::item and position() mod 3 = 1]">
   <div>
    <xsl:copy-of select=
    ".|following-sibling::*[not(position()>2)]"/>
   </div>
 </xsl:template>

 <xsl:template match=
  "node()[self::item and not(position() mod 3 = 1)]"/>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...