簡體   English   中英

使用XSL將XML列表轉換為HTML表

[英]Convert XML List to HTML Table Using XSL

您好,過去幾天我一直在為此苦苦掙扎,但找不到很好的答案或解決方案。 我有一個帶有這樣的對象列表的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<LineItems>
    <TableName>Lines</TableName>
    <TableTerm>Lines</TableTerm>
    <LineItems>
        <Class>A Class</Class>
    </LineItems>
    <LineItems>
        <Number>1234</Number>
    </LineItems>
    <LineItems>
        <Description>G</Description>
    </LineItems>
    <LineItems>
        <Class>B Class</Class>
    </LineItems>
    <LineItems>
        <Number>5678</Number>
    </LineItems>
    <LineItems>
        <Description>F</Description>
    </LineItems>
    <ColumnMetadata>
        <Name>Class</Name>
        <Term>Class</Term>
    </ColumnMetadata>
    <ColumnMetadata>
        <Name>Number</Name>
        <Term>No</Term>
    </ColumnMetadata>
    <ColumnMetadata>
        <Name>Description</Name>
        <Term>Description</Term>
    </ColumnMetadata>
</LineItems>

我正在應用以下轉換:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
    <xsl:variable name="columns" select="count(LineItems/ColumnMetadata)" />
    <xsl:variable name="items" select="count(LineItems/LineItems)" />
    <xsl:variable name="rows" select="$items div $columns" />
    <table border="1">
        <thead >
            <tr bgcolor="#9acd32">
                <xsl:for-each select="LineItems/ColumnMetadata">
                    <th style="padding: .3em 0;">
                        <xsl:value-of select="Term" />
                    </th>
                </xsl:for-each>
            </tr>
        </thead>
        <tbody style="text-align: center;">
            <xsl:for-each select="(//LineItems)[position()&lt;=$rows]">
            <xsl:variable name="i" select="position() - 1"/>
            <tr>
                <xsl:for-each select="(//*)[position()&lt;=$columns]">
                    <xsl:variable name="j" select="position()+($columns*$i)"/>
                    <td style="padding: .3em 0;">
                        <xsl:value-of select="LineItems/LineItems[$j]" />
                    </td>
                </xsl:for-each>
            </tr>
            </xsl:for-each>
        </tbody>
    </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

最后,這種情況下的期望輸出為:

<table>
  <thead>
    <tr>
      <th>Class</th>
      <th>No</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
        <td>A Class</td>
        <td>1234</td>
        <td>G</td>
    </tr>
    <tr>
        <td>B Class</td>
        <td>5678</td>
        <td>F</td>
    </tr>
  </tbody>
</table>

這種情況是MxN表的情況,我知道節點中有多少列。 因此,總結一下:

  • 必須轉換為表格的實際列表都在根<LineItems>內部。
  • 我不知道要獲得多少個項目(行),但是我可以計算它們除以<LineItems>節點($ items)的數量<ColumnMetadata>節點($ columns)的數量
  • 諸如<Class><Number><Description> <Class>節點是表中的列,但是它們可以具有其他名稱,它們是動態的,可以是5、6 ...許多列。

如果我在在線工具中使用XSL在XML之上進行轉換,我只會得到表的標題行(並且檢查HTML,我可以看到2行包含2個項目,但為空)。 如果使用Visual Studio轉換工具,則不僅會獲得標題行,而且還會獲得表的前2列(在此示例中為Class值),而不是其余部分的值。 我真的不明白發生了什么,為什么我使用不同的工具會得到不同的結果。

提前致謝

lineitmes遵循常規模式。

那么我相信這可能很簡單:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/LineItems">
    <xsl:variable name="columns" select="count(ColumnMetadata)"/>
    <table border="1">
        <thead >
            <tr>
                <xsl:for-each select="ColumnMetadata">
                    <th>
                        <xsl:value-of select="Term"/>
                    </th>
                </xsl:for-each>
            </tr>
        </thead>
        <tbody>
            <xsl:for-each select="LineItems[position() mod $columns = 1]">
                <tr>
                    <xsl:for-each select=". | following-sibling::LineItems[position() &lt; $columns]">
                        <td>
                            <xsl:value-of select="*"/>
                        </td>
                    </xsl:for-each>
                </tr>
            </xsl:for-each>
        </tbody>
    </table>
</xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM