这是我的 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 有更坚定的把握。