1

XML ドキュメントをテキスト形式に変換する XSLT 変換を作成したいと考えています。このテキスト形式は構造化されているため、それに応じて書式設定する必要があります。つまり、インデントします。

例えば:

この文書を考えると、

<root>
    <l1>
        <l2>
            <l3>
                <l4>
                </l4>
            </l3>
            <l3>
                <l4>
                </l4>
            </l3>
        </l2>
    </l1>
</root>

これを出力として欲しい:

l1 (
    l3 (
        foo (
            l4 (
            )
        )
    )
    l3 (
        foo (
            l4 (
            )
        )
    )
)

より多くのレベルがある場合は、さらに深くインデントする必要があります。xml ドキュメントの正確な深さは可変です。さらに、ノード「foo」と「l2」の例に見られるように、特定のノードを削除または追加できる必要があります。

これは、xslt を使用して保守可能な方法で可能ですか? バージョンは xslt-1.0 with exslt です。

よろしく、
ヨスト

4

2 に答える 2

3

次のようなもの

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

 <xsl:variable name="vSpaces" select=
 "'                                                                 '"/>

 <xsl:template match="*/*">
  <xsl:param name="pIndent" select="0"/>
     <xsl:value-of select="substring($vSpaces, 1, $pIndent)"/>
     <xsl:value-of select="concat(name(), ' (')"/>
     <xsl:text>&#xA;</xsl:text>
     <xsl:apply-templates select="*">
       <xsl:with-param name="pIndent" select="$pIndent+string-length(name())+3"/>
     </xsl:apply-templates>
     <xsl:value-of select=
     "substring($vSpaces, 1, $pIndent+ string-length(name()))"/>
     <xsl:text>)&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<root>
    <l1>
        <l2>
            <l3>
                <l4>
                </l4>
            </l3>
            <l3>
                <l4>
                </l4>
            </l3>
        </l2>
    </l1>
</root>

正しくインデントされた出力が生成されます:

l1 (
     l2 (
          l3 (
               l4 (
                 )
            )
          l3 (
               l4 (
                 )
            )
       )
  )

さらに、ノード「foo」と「l2」の例に見られるように、特定のノードを削除または追加できる必要があります。

変換を 2 つのパスで構成します。最初のパスでは、ソース XML ドキュメントを必要な最終 XML ドキュメントに変換します。次に、2 番目のパスで上記の変換を適用して、目的のテキスト結果を生成します。

詳細については、「XSLT マルチパス変換」を検索してください。

于 2012-08-09T13:27:11.887 に答える
0

はい、繰り返す必要があるのは、反復の LEVEL ごとに出力の前に多数のタブ/スペースを追加することだけです。

于 2012-08-09T13:11:21.937 に答える