XSL: запрос Xpath в <xsl: apply-templates> не возвращает никаких результатов - PullRequest
2 голосов
/ 17 апреля 2011

Примечание 1: Это мой первый вопрос здесь. Пожалуйста, будьте нежны.
Примечание 2: Да, это домашнее задание. Ненавижу просить помощи, но я врезался в кирпичную стену. Если вы не хотите, чтобы сказать мне ответ, предложение того, где искать ответ, будет одинаково признателен. Спасибо.

Я пытаюсь написать лист XSLT, в котором рассматривается атрибут жанра каждого элемента DVD в целевом XML-файле. Предполагается, что будет возвращен список, в котором каждое из различных значений будет перечислено ровно один раз с подсчетом количества раз, когда каждое значение было найдено.

Я думаю, что мой 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 Ответ

1 голос
/ 18 апреля 2011

Как «выбрать» из XML пространства имен? должно помочь вам с тем, что вам нужно.

Пространства имен XML - это просто способ обеспечения уникальности элементов и атрибутов XML. Если два пользователя / компании / whatevers определяют элемент <DVD>, пространство имен - это способ, которым они хранятся отдельно. Таким образом, вы можете, например, обработать два разных элемента <DVD>, выбрав каждый из них вместе с соответствующим пространством имен, в котором он был определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...