1

XSL を使用して XML ファイルを見栄えの良い HTML テーブルに変換しようとしていますが、列をすべて適切に並べる方法を一生理解できません。同様の質問 ( Convert XML List to HTML Table Using XSL ) を見つけましたが、これは参考になりました (私は一般的に XSL にかなり慣れていないので、少しずつ役に立ちます)、私の XML はもう少し構造化されています... 不規則:

<?xml version="1.0"?>
<root>
    <Group>
        <Type>Type1</Type>
        <Desc>Desc1</Desc>
        <Name>Name1</Name>
    </Group>
    <Group>
        <Type>Type2</Type>
        <Name>Name2</Name>
        <State>State2</State>
    </Group>
    <Group>
        <Type>Type3</Type>
        <State>State3</State>
        <Country>Country4</Country>
    </Group>
</root>

これを適切にフォーマットされたテーブルに変換する良い方法はありますか? Group 要素の 1 つに新しいフィールドを追加したとしても、他のすべての要素に同じタグを追加する必要はありません (ただし、欠落しているすべての子を、他の Group 要素に存在する Group 要素に自動的に追加する良い方法が代わりにある場合は、最初に実行できる 2 番目の XSLT を使用することもできます)。この XML のバッキング スキーマはありませんが、役立つ場合は作成できます。

これが以前に回答されている場合は申し訳ありませんが、上記の質問以外に近いものは見つかりませんでした。また、欠落している子を要素に追加する方法についても何も見つかりませんでした。

4

2 に答える 2

0

XSLT 2.0 ソリューションでの私の試みは次のとおりです。

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />

    <xsl:variable name="col-names" select="distinct-values(root/Group/*/node-name(.))"/>

    <xsl:template match="root">
        <table>
            <thead>
                <tr>
                    <xsl:for-each select="$col-names">
                        <th>
                            <xsl:value-of select="."/>
                        </th>
                    </xsl:for-each>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates select="Group"/>                
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="Group">
        <tr>
            <xsl:variable name="this" select="."/>
            <xsl:for-each select="$col-names">
                <td>
                    <xsl:value-of select="$this/*[node-name(.) eq current()]"/>
                </td>
            </xsl:for-each>
        </tr>
    </xsl:template>
</xsl:transform>
于 2015-08-21T17:59:50.693 に答える