(私はこの質問を広範囲に調査しましたが、まだ適切な解決策を見つけていません。)
XSLT を使用して、一連の XML ファイルを「ツリー」のような HTML ドキュメントに変換しています。このドキュメントでは、要素間の親子関係がインデントで反映されています。
以下の解決策は問題なく機能しますが、冗長すぎます。また、将来、スキーマにいくつかの新しい要素を追加することにも対応する必要があります。
私たちが必要とすることを行う優れた汎用ソリューションは何ですか? 「深さ」変数が使用され、インクリメントされてパラメーターとして渡され、インデントレベルを駆動するために使用される再帰的なソリューションをオンラインで見ました。これは一般的なパターンのようですが、私にはうまくいきませんでした。
ありがとう。
したがって、私のデータファイルは次のようになります。
<document>
<metadata>
<version>1.0</version>
<date>1/1/12</date>
etc...
</metadata>
<trackdata>
<tracks>
<track>123</track>
<track>456</track>
etc...
</trackdata>
</document>
そして XSLT (さまざまなレベルでの text-indent のさまざまな値に注意してください):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no"/>
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="metadata">
Metadata: <xsl:apply-templates/>
</xsl:template>
<xsl:template match="version">
<div style="text-indent:3em">Version: <xsl:value-of select="text()"/></div>
</xsl:template>
<xsl:template match="date">
<div style="text-indent:3em">Date: <xsl:value-of select="text()"/></div>
</xsl:template>
<xsl:template match="trackdata">
Track Data: <xsl:value-of select="text()"/></div>
</xsl:template>
<xsl:template match="tracks">
<div style="text-indent:3em">Tracks: <xsl:apply-templates/>
</xsl:template>
<xsl:template match="track">
<div style="text-indent:6em">Track: <xsl:value-of select="text()"/></div>
</xsl:template>
等...