0

属性「folded」が「yes」または「no」に設定された親ノード(「folder」)の条件で表示されるリストを作成するのに苦労しています。結果には、リストの最初の2つのレベルのみが表示され、以下のように3番目のレベルは表示されません。

  • 1日 レベル:表示
  • 2位。レベル:表示
  • 3位。レベル:表示なし

アイデアは、'folder'-属性<folder folded="yes">をでチェックすること<xsl:if test="not(parent::yes)">です。それは3番目の資格があるはずです。表示されないレベルですが、どういうわけか私がやりたいことをしません。おそらく間違った構文や構文を使用しています。支援に感謝します、ありがとう。

一部のコンテンツを含むXML構造:

<xbel>
    <folder folded="yes">
        <level>1</level>
        <title>bookmarks</title>
        <desc>my bookmarks</desc>
        <folder folded="no">
            <level>2</level>
            <title>Android</title>
            <desc>my Android</desc>
            <bookmark href="http://www.phonesreview.co.uk/">
                <title>HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend</title>
                <desc>The new HTC Sync 3.0.5422 update will be most welcome...</desc>
            </bookmark>
            <folder folded="no">
                <level>3</level>
                <title>Apps</title>
                <desc>Android Apps</desc>
                <bookmark href="http://www.androidzoom.com/">
                    <title>Android Communication Apps</title>
                    <desc>Download Communication Apps for Android.</desc>
                </bookmark>
                <bookmark href="http://www.htc.com/">
                    <title>HTC - Android</title>
                    <desc>Apps for HTC-Android.</desc>
                </bookmark>
            </folder>
        </folder>
    </folder>
</xbel>

XSLT:

 <!--creates a nested list of elements named 'folder'-->
<xsl:template match="folder" mode="linklist">
    <li>
        <xsl:if test="folder/level = 2">
                Level:<xsl:value-of select="level"/> / 
                Title:<xsl:value-of select="title"/> / 
                Desc:<xsl:value-of select="desc"/>
        <ul>
            <xsl:apply-templates mode="linklist" />
        </ul>
        </xsl:if>
    </li>
</xsl:template>

<xsl:template match="bookmark" mode="linklist">
    <li>  <!-- this bookmark is just another item in the list of bookmarks -->
        <!-- the title -->
            <a rel="nofollow" href="{@href}"><xsl:value-of select="title"/></a>
        <!-- the description -->
        <xsl:if test="desc">
            <span class="bookmarkDesc">
                <xsl:value-of select="desc"/>
            </span>
        </xsl:if>
    </li>
</xsl:template>

スタイルシートHTML

<body>

<ul>
    <xsl:apply-templates mode="linklist" />
</ul>

</body>

生成された出力(レベル:1-3)

Level:1 / Title:bookmarks / Desc:my bookmarks
        Level:2 / Title:Android / Desc:my Android
            HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend ...
            Level:3 / Title:Apps / Desc:Android Apps
                Android Communication AppsDownload Communication Apps for Android.
                HTC - AndroidApps for HTC-Android.

予想される出力:(レベル:1-2)

Level:1 / Title:bookmarks / Desc:my bookmarks
        Level:2 / Title:Android / Desc:my Android
            HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend ...

このテンプレートを試しましたが、最後の2つのノードが出力されるため、最初の2つのノードが必要です。

<xsl:template match="folder[parent::folder/@folded = 'yes']" mode="linklist">
4

1 に答える 1

1

展開された要素の処理を防ぐために行うことができる最も簡単な変更folderは、それらを飲み込む(つまり、出力を生成しない)空のテンプレートを追加することです。

<xsl:template match="folder[@folded='no']" mode="linklist"/>

に等しい属性folderを持たないすべての要素は、既存のテンプレートを使用して処理されます。そうするものは、この新しいものによってキャプチャされます。foldedno

代わりに、(更新されたXMLの例のように)親の属性と等しいfolder独自の属性を持つ各要素を処理する場合は、次のテンプレートを使用します。foldedyes

<xsl:template match="folder[@folded='yes' or ../@folded='yes']" mode="linklist">
    <!-- body elided -->
</xsl:template>

folder他のすべての要素を非表示にするための空のテンプレートも含めることをお勧めします。

<xsl:template match="folder" mode="linklist" />
于 2011-08-22T14:29:58.897 に答える