Как определить порядок столбцов таблицы в xslt?

Из следующего XML:

<?xml version="1.0"?>     
<lieferungen>
  <artikel id="3526">
    <name>apfel</name>
    <preis stueckpreis="true">8.97</preis>
    <lieferant>Fa. Krause</lieferant>
  </artikel>
  <artikel id="7866">
    <name>Kirschen</name>
    <preis stueckpreis="false">10.45</preis>
    <lieferant>Fa. Helbig</lieferant>
  </artikel>
  <artikel id="3526">
    <name>apfel</name>
    <preis stueckpreis="true">12.67</preis>
    <lieferant>Fa. Liebig</lieferant>
  </artikel> 
  <artikel id="7789">
    <name>Ananas</name>
    <preis stueckpreis="true">8.60</preis>
    <lieferant>Fa. Richard</lieferant>
  </artikel>
</lieferungen>

Я хочу создать таблицу, которая выглядит следующим образом:

таблица с четырьмя столбцами

С этой целью я написал следующее xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="lieferungen">
        <html>
            <head>
                <title>
                    <xsl:text>Lieferungen</xsl:text>
                </title>
            </head>
            <body bgcolor="#ffffff">
                <h1>
                    Lieferungen (Deliveries)
                </h1>
                <hr/>
                <table border="1">
                    <tr>
                        <th>Nummer</th>
                        <th>Article</th>
                        <th>Price</th>
                        <th>Supplier</th>
                    </tr>
                    <xsl:apply-templates/>             
                </table>
            </body>
            <hr/>
            <p>

            </p>
        </html>
    </xsl:template>
    <xsl:template match="artikel">
        <tr>
            <td>
                <xsl:value-of select="@id"/>
            </td>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>

     <xsl:template match="name">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>

     <xsl:template match="preis">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>

    <xsl:template match="lieferant">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>


</xsl:stylesheet>

Код работал нормально, и я получил свою таблицу... однако, теперь я хочу переключить столбцы, в частности, я хочу переключить столбцы 3 и 4. Для этого я просто переключаю порядок шаблона для "preis" и " Lieferant", то есть новый порядок теперь:

    <xsl:template match="lieferant">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>

    <xsl:template match="preis">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>

Остальной код такой же. Однако этот подход не сработал, и порядок столбцов в таблице остался прежним.

Поэтому мой вопрос: как я могу заставить компьютер использовать

  <xsl:template match="lieferant">

в третьем и

   <xsl:template match="preis">

для четвертого столбца таблицы?

1 ответ

Решение

Порядок, в котором шаблоны появляются в таблице стилей, не имеет значения (кроме случаев разрешения конфликтов). Чтобы переключить столбцы, измените это:

<xsl:template match="artikel">
    <tr>
        <td>
            <xsl:value-of select="@id"/>
        </td>
        <xsl:apply-templates/>
    </tr>
</xsl:template>

к:

<xsl:template match="artikel">
    <tr>
        <td>
            <xsl:value-of select="@id"/>
        </td>
        <xsl:apply-templates select="name, lieferant, preis"/>
    </tr>
</xsl:template>

Не забудьте также поменять метки столбцов.


Также обратите внимание, что вы можете объединить последние три шаблона в один как:

<xsl:template match="name | preis | lieferant">
    <td>
        <xsl:value-of select="."/>
    </td>
</xsl:template>

и даже сократить весь блок до просто:

<xsl:template match="artikel">
    <tr>
        <xsl:apply-templates select="@id, name, lieferant, preis"/>
    </tr>
</xsl:template>

<xsl:template match="@id | name | preis | lieferant">
    <td>
        <xsl:value-of select="."/>
    </td>
</xsl:template>
Другие вопросы по тегам