如何确定 xslt 中 table 列的顺序?

How to determine the order of table columns in 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>

我想创建一个如下所示的 table:

为此我写了下面的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>

代码运行良好,我得到了 table ... 但是,现在我想切换列,特别是我想切换第 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>

其余代码相同。但是这种方法没有奏效,table 中列的顺序保持不变。

因此我的问题是:如何让电脑使用

  <xsl:template match="lieferant">

在第三和

   <xsl:template match="preis">

对于第四列table?

模板在样式表中的出现顺序没有意义(解决冲突时除外)。要切换列,请更改:

<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>