さまざまな階層から ID を抽出して一覧表示する必要があるという要件があります。以下は XML のサンプルです: (顔色を反映するために 3 レベルの階層を用意しました)
入力 XML:
<Wrapper>
<A Id="A@1">
<B Id="B#1">
<C Id="C$1"/>
<C Id="C$2"/>
</B>
<B Id="B#2">
<C Id="C$3"/>
<C Id="C$4"/>
</B>
<B Id="B#3">
<C Id="C$5"/>
<C Id="C$6"/>
</B>
<B Id="B#4>
<C Id="C$7"/>
<C Id="C$8"/>
</B>
</A>
</Wrapper>
望ましい出力:
A Ids:
A@1
B Ids:
B#1
B#2
B#3
B#4
C Ids:
C$1
C$2
C$3
C$4
C$5
C$6
C$7
C$8
入力 XSL:原理は単純です: ルート要素 "\" に遭遇し、テキストを書き込み、階層ごとに絶対 XPath とアクセス ID を提供します。コードは次のとおりです。
<?xml version ="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="linefeed" select="' '"/>
<xsl:template match="/">
<!--List of A Ids-->
<xsl:text>A Ids:</xsl:text>
<xsl:value-of select="$linefeed"/>
<xsl:for-each select="/Wrapper/A/@Id">
<xsl:value-of select="concat(.,$linefeed)"/>
</xsl:for-each>
<xsl:value-of select="$linefeed"/>
<!--List of B Ids-->
<xsl:text>B Ids:</xsl:text>
<xsl:value-of select="$linefeed"/>
<xsl:for-each select="/Wrapper/A/B/@Id">
<xsl:value-of select="concat(.,$linefeed)"/>
</xsl:for-each>
<xsl:value-of select="$linefeed"/>
<!--List of C Ids-->
<xsl:text>C Ids:</xsl:text>
<xsl:value-of select="$linefeed"/>
<xsl:for-each select="/Wrapper/A/B/C/@Id">
<xsl:value-of select="concat(.,$linefeed)"/>
</xsl:for-each>
<xsl:value-of select="$linefeed"/>
</xsl:template>
</xsl:stylesheet>
もっと良い方法はありますか??