Как сделать зебра в xslt

Я пытаюсь сделать полоску зебры для моего файла PDF. XML, как показано ниже:

<root>
   <order>
      <attribute1>1</attribute1>
      <attribute2>2</attribute2>
      <attribute3>0</attribute3>
      <attribute4>4</attribute4>
      <attribute5/>
   </order>
</root>

Атрибут3 не появляется, если значение равно 0. Атрибут5 также не отображается, если для него нет значения. Поэтому я не могу сделать полоску зебры, как показано ниже:

<fo:table-row (colored)>

   <fo:table-cell>
     <fo:block>
       <xsl:text>Attribute1</xsl:text>
      </fo:block>
   </fo:table-cell>

   <fo:table-cell>
     <fo:block>
       <xsl:text>...</xsl:text>
      </fo:block>
   </fo:table-cell>
</fo:table-row>

<fo:table-row (non colored)>
   <fo:table-cell>
     <fo:block>
       <xsl:text>Attribute2</xsl:text>
      </fo:block>
   </fo:table-cell>

   <fo:table-cell>
     <fo:block>
       <xsl:text>...</xsl:text>
      </fo:block>
   </fo:table-cell>
</fo:table-row>

Потому что attribute3 и attribute5 не всегда появляются в pdf-файле. Как мне это сделать?

1 ответ

Здесь нужно сначала использовать xsl:apply-templates, чтобы выбрать только дочерние узлы, которые вы хотите вывести (предполагается, что вы в данный момент расположены на элементе order:

<xsl:apply-templates select="*[normalize-space()][. != '0']" />

Затем у вас есть шаблон для соответствия дочерним элементам элементов порядка, например:

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

<fo:table-row>
  <xsl:if test="position() mod 2 = 0">
    <xsl:attribute name="colour">zebra</xsl:attribute>
  </xsl:if>

Попробуйте это XSLT как начало

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

  <xsl:template match="order">
    <fo:table>
      <xsl:apply-templates select="*[normalize-space()][. != '0']" />
    </fo:table>
  </xsl:template>

  <xsl:template match="order/*">
    <fo:table-row>
      <xsl:if test="position() mod 2 = 0">
        <xsl:attribute name="colour">zebra</xsl:attribute>
      </xsl:if>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="local-name()" />
        </fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>
          <xsl:text>...</xsl:text>
        </fo:block>
      </fo:table-cell>
    </fo:table-row>
  </xsl:template>
</xsl:stylesheet>

Очевидно, вы бы использовали правильный стиль xsl-fo здесь, а не буквально атрибут "color=zebra", как показано здесь....

Другие вопросы по тегам