XSL:<xsl:apply-templates>中的Xpath查询未返回任何结果</xsl:apply-templates>

时间:2011-04-17 19:01:49

标签: xml xslt xpath

注1:这是我的第一个问题。请温柔 注2:是的,这是作业。我讨厌寻求帮助,但我碰到了一堵砖墙。如果您不想告诉我答案,建议在哪里寻找答案同样会受到赞赏。谢谢。

我正在尝试编写一个XSLT表,查看目标XML文件中每个DVD元素的genre属性。它应该返回一个列表,其中每个不同的值只列出一次,并计算每个值的计数次数。

我认为我的XPath是错误的。为了调试,我尝试使用<xsl:value-of select="foo">语句来尝试不同的XPath查询,但我没有运气。

这是XSL文件(我试图将其剥离到大头钉)

<?xml version="1.0" encoding="UTF-8"?>
<!-- BrowseAllExample.xsl -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">    
    <xsl:key name="genres" match="DVD" use="@genre" />    
    <xsl:template match="/">
        <html>
            <head>
                <title>Browse: DVDs by Genre</title>
                <link href="../style/browseByGenre.css" rel="stylesheet" type="text/css"/>
            </head>
            <body>
                <!-- TODO: insert page header here -->
                <h2>Browse by Genre</h2>
                <div>                    
                    <!-- This doesn't seem to select anything
                    I've tried lots of combinations with a test
                    xsl:value-of-select element, but nothing 
                    seems to work as a selector except "*"                    
                    -->
                    <xsl:apply-templates select="/dvdlist/DVD[not(@genre=preceding-sibling/@genre)]"
                        mode="genreList">
                        <xsl:sort select="@genre"/>
                    </xsl:apply-templates>
                </div>
            </body>
        </html>
    </xsl:template>
    <!-- 
    List each genre and count titles in each
    -->
    <xsl:template match="DVD" mode="genreList">
        <a href="#{generate-id()}"><xsl:value-of select="@genre"/></a> (<xsl:value-of
            select="count(key('genres',@genre))"/>) - 
    </xsl:template>
</xsl:stylesheet>

以下是XML文件的相关部分:

<?xml version="1.0" encoding="UTF-8"?>
<!-- dvdlistExample.xml -->
<?xml-stylesheet type="text/xsl" href="BrowseAllExample.xsl"?>
<dvdlist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://example.com/dvdlist ./schema/dvdlist.xsd"
    xmlns="http://example.com/dvdlist">
    <DVD genre="Comedy" itemnum="ID-20">
        <title>American Wedding</title>
        <year>2003</year>
        <price>18.89</price>
        <talent>
            <director>Jesse Dylan</director>
            <actor>Jason Biggs</actor>
            <actor>Sean William Scott</actor>
            <actor/>
        </talent>
        <ratings mpaa="NR" customer="3"/>
        <pics id="ID-20">
            <thumbnail>Wedding-small.jpg</thumbnail>
            <large>Wedding-big.jpg</large>
        </pics>
    </DVD>
    <DVD genre="Action" itemnum="ID-2">
        <title>Badboys II</title>
        <year>2003</year>
        <price>20.27</price>
        <talent>
            <director>Michael Bay</director>
            <actor>Will Smith</actor>
            <actor>Martin Lawrence</actor>
        </talent>
        <ratings mpaa="R" customer="3"/>
        <pics id="ID-2">
            <thumbnail>Badboys-small.jpg</thumbnail>
            <large>Badboys-big.jpg</large>
        </pics>
    </DVD>
    <!--Other DVD entries removed to save space-->
</dvdlist>

1 个答案:

答案 0 :(得分:1)

How to 'select' from XML with namespaces?可以帮助您满足您的需求。

XML命名空间只是一种启用XML元素和属性唯一性的方法。如果两个用户/公司/ whatevers定义了<DVD>元素,则命名空间就是它们分开的方式。例如,您可以通过选择每个元素以及定义它的相应命名空间来处理两个不同的<DVD>元素。