1

这是我的 xml(大大简化和缩短,在我的真实交易中有 100 多个“电影”元素)

<mediaList>
    <movie>
        <title>Hugo</title>
        <genreWrap>
            <genre>Children and Family</genre>
            <subGenre>Book Characters</subGenre>
            <subGenre>Family Adventures</subGenre>
            <subGenre>Family Dramas</subGenre>
        </genreWrap>
        <genreWrap>
            <genre>Drama</genre>
            <subGenre>Family Dramas</subGenre>
        </genreWrap>
    </movie>
    <movie>
        <title>Vanishing Point</title>
        <genreWrap>
            <genre>Action and Adventure</genre>
            <subGenre>Action Classics</subGenre>
            <subGenre>Action Thrillers</subGenre>
        </genreWrap>
        <genreWrap>
            <genre>Thrillers</genre>
            <subGenre>Action Thrillers</subGenre>
        </genreWrap>
    </movie>
    <movie>
        <title>White Lightning</title>
        <genreWrap>
            <genre>Action and Adventure</genre>
            <subGenre>Crime Action</subGenre>
        </genreWrap>
        <genreWrap>
            <genre>Sports and Fitness</genre>
            <subGenre>Motorsports</subGenre>
            <subSubGenre>Auto Racing</subSubGenre>
        </genreWrap>
    </movie>
    <movie>
        <title>Kon-Tiki</title>
        <genreWrap>
            <genre>Action and Adventure</genre>
            <subGenre>Adventures</subGenre>
            <subGenre>Foreign Action and Adventure</subGenre>
        </genreWrap>
        <genreWrap>
            <genre>Drama</genre>
            <subGenre>Dramas Based on Real Life</subGenre>
            <subGenre>Family Dramas</subGenre>
            <subGenre>Period Pieces</subGenre>
            <subSubGenre>20th Century Period Pieces</subSubGenre>
        </genreWrap>
        <genreWrap>
            <genre>Foreign</genre>
            <subGenre>Foreign Action and Adventure</subGenre>
            <subGenre>Foreign Dramas</subGenre>
            <subGenre>Foreign Languages</subGenre>
            <subGenre>Foreign Regions</subGenre>
            <subSubGenre>Norwegian Language</subSubGenre>
            <subSubGenre>Scandinavia</subSubGenre>
        </genreWrap>
    </movie>
    <movie>
        <title>Mummy, The</title>
        <director>Stephen Sommers</director>
        <genreWrap>
            <genre>Action and Adventure</genre>
            <subGenre>Action Thrillers</subGenre>
            <subGenre>Adventures</subGenre>
        </genreWrap>
        <genreWrap>
            <genre>Horror</genre>
            <subGenre>Monsters</subGenre>
        </genreWrap>
        <genreWrap>
            <genre>Thrillers</genre>
            <subGenre>Action Thrillers</subGenre>
            <subGenre>Supernatural Thrillers</subGenre>
        </genreWrap>
    </movie>
</mediaList>

我已经从这个例子中删除了除了标题和类型之外的所有内容,因为那是让我绊倒的部分。我正在尝试将它们转换为可用作可导航工具栏的良好格式

像这样的东西:

                <ul>
                    <li>Action and Adventures
                        <ul>
                            <li>
                               Action Classics
                            </li>
                             <li>
                               Action Thrillers
                             </li>
                             <li>
                               Adventures
                             </li>
                             <li>
                               Crime Action
                             </li>
                             <li>
                               Foreign Action and Adventure
                             </li>
                        </ul>
                     </li>
                    <li>Children and Family
                        <ul>
                            <li>
                               Book Characters
                            </li>
                             <li>
                               Family Adventures 
                             </li>
                             <li>
                               Family Dramas
                             </li>
                        </ul>
                     </li>
                 </ul>

等等等等。每个“流派”都有一个<li>,并且它的所有子流派都被放置<ul>在它下面的一个新的,如果有一个子子流派(就像 Kon-Tiki 一样)它只是扩展了一个级别。

我一直在阅读关于钥匙和 Muenchian Grouping 的文章——

我的 XSL 文件顶部有这个键

<xsl:key name="movieByGenre" match="genre" use="."/>

并了解它按我给它们的名称索引过流派元素,然后使用

select="movie//*[generate-id() = generate-id(key('movieByGenre', .)[1])]"

在一个<xsl:for-each><xsl:apply-templates>我可以做任何我想做的每一个流派。这工作正常。

它让子流派出现在每一个杀死我的地方。

我有这个,这是错误的,但我不知道如何使它正确。

<?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
            <xsl:output method="html" indent="yes"/>

        <xsl:key name="keyGenre" match="genre" use="."/>    
        <xsl:key name="keySubGenre" match="subGenre" use="../genre"/> 

        <xsl:template match="mediaList">
            <ul>
      <xsl:for-each select="movie//*[generate-id() = generate-id(key('keyGenre', .)[1])]">  
                      <xsl:sort order="ascending"/>
                            <li>
                   <xsl:value-of select="."/>
                 <ul>
                    <li>
<xsl:for-each select="movie//*[generate-id() = generate-id(key('keySubGenre', .)[1])]">
                                <xsl:sort order="ascending"/>
    <xsl:value-of select="."/>
</li>
    </xsl:for-each>
</ul>
</li>
                </xsl:for-each>
     </ul>
    </xsl:template>
          </xsl:stylesheet>

如果您能解释它是如何工作的,我很乐意接受 xsl 2.0 解决方案!但我对 1.0 有更坚定的把握。

4

1 回答 1

1

我不确定你想如何处理 subSubGenres - 它们似乎没有嵌套在 subGenres 下。对于前两个级别,请尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="genre" match="genre" use="."/>  
<xsl:key name="subGenre-by-genre" match="subGenre" use="../genre"/> 
<xsl:key name="subGenre" match="subGenre" use="concat(../genre, '|', .)"/> 

<xsl:template match="/">
    <ul>
        <!-- for each distinct genre ... -->
        <xsl:for-each select="mediaList/movie/genreWrap/genre[generate-id()=generate-id(key('genre', .)[1])]">  
            <xsl:sort/>
            <li>
                <xsl:variable name="genre" select="." />
                <xsl:value-of select="$genre"/>
                <ul>
                    <!-- ... get the list of the relevant sub-genres ... -->
                    <xsl:variable name="mySubGenres" select="key('subGenre-by-genre', .)" />
                    <!-- ... and de-dupe it -->
                    <xsl:for-each select="$mySubGenres[generate-id()=generate-id(key('subGenre', concat($genre, '|', .))[1])]">
                        <xsl:sort/>
                        <li><xsl:value-of select="."/></li>
                    </xsl:for-each>
                </ul>
            </li>
        </xsl:for-each>
    </ul>
</xsl:template>

</xsl:stylesheet>
于 2014-06-05T00:26:58.227 回答