XSLT применить атрибут в зависимости от позиции - PullRequest
1 голос
/ 07 января 2011

Я использую XSLT для веб-сайта на основе 960 grid css framework.

У меня есть столбцы div, которые охватывают всю страницу, если это первый div в строке, к которому сначала должен быть применен класс, если он средний, то класса нет, и если он является третьим в строке, он должен иметь последний примененный класс.

Я действительно почесал голову, потому что лучший способ сделать это - любая помощь ценится.

Ниже приведена структура, которой я хочу закончить, числа внутри div представляют позицию.

<div class="container_12">
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
        <div class="grid_4 alpha">
            1
        </div>
        <div class="grid_4 ">
            2
        </div>
        <div class="grid_4 omega">
            3
        </div>
        <div class="grid_4 alpha">
            4
        </div>
    </div>
</div>

1 Ответ

1 голос
/ 07 января 2011

Это преобразование :

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

 <my:classes>
  <class class="omega"></class>
  <class class="alpha"></class>
  <class/>
 </my:classes>

 <xsl:variable name="vClasses" select=
  "document('')/*/my:classes/*"/>

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

 <xsl:template match="div[@id='main-content']/div">
  <xsl:variable name="vPos123" select=
    "1 + (position() mod 3)"/>
  <div class="{@class} {$vClasses[$vPos123]/@class}">

   <xsl:apply-templates select=
   "node()|@*[not(name()='class')]"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему документу XML :

<div class="container_12">
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
        <div class="grid_4">
                     1
        </div>
        <div class="grid_4 ">
                     2
        </div>
        <div class="grid_4">
                     3
        </div>
        <div class="grid_4">
                     4
       </div>
  </div>
</div>

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

<div class="container_12">
   <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
      <div class="grid_4 alpha">
                     1
        </div>
      <div class="grid_4  ">
                     2
        </div>
      <div class="grid_4 omega">
                     3
        </div>
      <div class="grid_4 alpha">
                     4
       </div>
   </div>
</div>

Объяснение :

  1. Правило идентификации копирует каждый узел "как есть", если не переопределено.

  2. Шаблон переопределяет правило идентификации для элементов вида div[@id='main-content']/div

  3. Выражение 1 + (position() mod 3) отображает положение в набор {2, 3, 1}.

  4. Вышеупомянутое выражение используется в качестве индекса в дочерние элементы глобально указанного элемента <my:classes> для извлечения нового класса CSS, который будет добавлен к элементу div

...