1

(私はこの質問を広範囲に調査しましたが、まだ適切な解決策を見つけていません。)

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>

等...

4

1 に答える 1

2

値を保持する変数を作成してみてくださいtext-indent。このようなもの:

  <xsl:template match="version">
    <xsl:variable name="vIndent" select="count(ancestor::*) * 3"/>    
    <div style="text-indent:{$vIndent}em">Version: <xsl:value-of select="text()"/></div>
  </xsl:template>

別の完全な使用例を次に示します...

XML 入力(整形式)

<document>
  <metadata>
    <version>1.0</version>
    <date>1/1/12</date>
  </metadata>
  <trackdata>
    <tracks>
      <track>123</track>
      <track>456</track>
    </tracks>
  </trackdata>
</document>

XSLT1.0

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

  <xsl:template match="text()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <html>
      <xsl:apply-templates/>
    </html>
  </xsl:template>

  <xsl:template match="*">
    <xsl:variable name="vIndent" select="count(ancestor::*) * 3"/>
    <div style="text-indent:{$vIndent}em"><xsl:value-of select="name()"/>: <xsl:apply-templates/></div>
  </xsl:template>

  <xsl:template match="document">
    <xsl:apply-templates/>
  </xsl:template>  

</xsl:stylesheet>

生の HTML 出力

<html>
   <div style="text-indent:3em">metadata: 
      <div style="text-indent:6em">version: 1.0</div>
      <div style="text-indent:6em">date: 1/1/12</div>
   </div>
   <div style="text-indent:3em">trackdata: 
      <div style="text-indent:6em">tracks: 
         <div style="text-indent:9em">track: 123</div>
         <div style="text-indent:9em">track: 456</div>
      </div>
   </div>
</html>

最初の div にインデントを付けたくない場合は、変数を次のように変更できます。

<xsl:variable name="vIndent" select="(count(ancestor::*) * 3) - 3"/>
于 2012-05-14T15:57:30.783 に答える