如何确定xslt中表格列的顺序?

时间:2017-01-25 21:11:13

标签: templates xslt apply-templates

来自以下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 with four columns

为此,我写了以下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 个答案:

答案 0 :(得分:2)

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

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