Xml XSLT键,嵌套或多个

Xml XSLT键,嵌套或多个,xml,xslt,muenchian-grouping,Xml,Xslt,Muenchian Grouping,这是我的xml(大大简化和缩短了,在我的实际交易中有100个“电影”元素) 在或中,我可以对每种体裁做我想做的任何事情。那很好 让子类型出现在每个子类型下,这让我很难受 我有这个,这是错误的,但我不知道如何使它正确 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

中,我可以对每种体裁做我想做的任何事情。那很好

让子类型出现在每个子类型下,这让我很难受

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

<?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>


如果您能解释XSL2.0的工作原理,我很乐意接受它!但我对1.0的理解更为坚定。

我不确定您希望如何处理子类型-它们似乎没有嵌套在子类型下。对于前两个级别,请尝试:

XSLT1.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>


wow!太快了!多亏了这一点——至于子体裁,他们总是紧跟着子体裁,所以会添加一个键,比如,我想是的(我必须确实尝试一下)。也许有更好的方法来处理这个问题。这些数据保存在哪里?都在我的电脑上computer@user3708965哈哈,是的,但是用什么格式?你应该使用一个数据库,在一个结构合理的数据库中,所需的类型、子类型等列表可以直接导出,而不需要所有这些舞蹈。哈哈哈——对不起,对不起,我知道这不是你要问的,我只是不确定你要问什么!这一切都在一个链接到我编写的xsd文件的大xml文件中
<xsl:key name="movieByGenre" match="genre" use="."/>
select="movie//*[generate-id() = generate-id(key('movieByGenre', .)[1])]"
<?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: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>