XSLT - несколько шаблонов внутри преобразования HTML - PullRequest
0 голосов
/ 14 декабря 2018

Я не могу найти какой-либо твердый, полезный ответ на это онлайн.Для класса мне нужно иметь файлы XML, XSD, XSL, HTML и CSS для включения. XML и XSD готовы, и они могут быть проверены, но у меня возникли проблемы с XSL / HTML.По сути, мне нужно иметь 5 разных шаблонов в одном и том же XSL - по одному для каждого раздела в моем XML.Вот основная схема моего XML:

<duchovny>
    <filmography>
        ...
    </filmography>
    <vg>
        ...
    </vg>
    <music>
        ...
    </music>
    <books>
        ...
    <awards>
        ...
    </awards>
</duchovny>

Это то, что у меня есть для моего XSL - он выдает ошибку, когда я пытаюсь отобразить мой XML в своем браузере («Ошибка загрузки таблицы стилей: парсингОшибка таблицы стилей XSLT. "):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
    <html>
        <head>
            <link rel="stylesheet" type="text/css" href="style.css"/>
            <title>All About David Duchovny</title>
        </head>
        <body>
            <xsl:template match="/">
                <header>
                    <h1>All About David Duchovny</h1>
                    <div id="navigation">
                        <nav>
                            <a href="#filmography">filmography</a> | 
                            <a href="#vg">video games</a> | 
                            <a href="#music">music</a> | 
                            <a href="#bookd">books</a> | 
                            <a href="#awards">awards</a>
                        </nav>
                    </div>
                </header>
            </xsl:template>
            <xsl:template match="filmography">
                <section>
                    <div id="filmography" a href="#filmography">
                        <h2>Filmography</h2>
                        <h3>Movies</h3>
                        <xsl:for-each select="//film">
                            <p><xsl:value-of select="film/info1/@title"/></p>
                        </xsl:for-each>
                    </div>
                </section>
            </xsl:template>
        </body>
    </html>
</xsl:stylesheet>

Я не могу понять, почему именно это не работает.Это работает, когда я ставлю сразу после выходного вызова, но тогда раздел, где я пытаюсь отобразить названия фильмов, не появляется (потому что мне нужно закрыть элемент HTML перед этим разделом, я думаю).Я не могу понять, как применить несколько шаблонов и заставить их все отображаться.

В качестве альтернативы (хотя и не работающей) у меня есть этот код, пытающийся использовать apply-template:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
    <xsl:template match="/">
        <html>
            <head>
                <link rel="stylesheet" type="text/css" href="style.css"/>
                <title>All About David Duchovny</title>
            </head>
            <body>
                <header>
                    <h1>All About David Duchovny</h1>
                    <div id="navigation">
                        <nav>
                            <a href="#filmography">filmography</a> | 
                            <a href="#vg">video games</a> | 
                            <a href="#music">music</a> | 
                            <a href="#bookd">books</a> | 
                            <a href="#awards">awards</a>
                        </nav>
                    </div>
                </header>
                <section>
                    <xsl:apply-template match="filmography" mode="filmography"/>
                </section>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="filmography">
        <div id="filmography" a href="#filmography">
            <h2>Filmography</h2>
            <h3>Movies</h3>
            <xsl:for-each select="//film">
                <p><xsl:value-of select="film/info1/@title"/></p>
            </xsl:for-each>
        </div>
    </xsl:template>
</xsl:stylesheet>

Буду очень признателен за вашу помощь !!

1 Ответ

0 голосов
/ 14 декабря 2018

Ваша проблема в этой строке ...

<xsl:apply-template match="filmography" mode="filmography"/>

Проблемы заключаются в следующем:

  1. Это должно быть xsl:apply-templates.
  2. match не является действительным атрибутом xsl:apply-templates.Вы должны использовать select
  3. Вы находитесь в шаблоне, соответствующем \, который является узлом документа.Это родительский узел duchovny, поэтому попытка выбрать filmography ничего не найдет.Вместо этого измените соответствие шаблона на \duchovny (или просто \*)
  4. Вам также не нужно mode здесь (хотя mode действительно, просто вам не нужноиспользовать его в этом случае)

Итак, это должно быть <xsl:apply-templates select="filmography" />, но вы упомянули о желании нескольких шаблонов, предположительно для совпадения vg и award и т. д. В этом случае простосделайте это, так как при этом будут выбраны все дочерние узлы duchovny и найден соответствующий им соответствующий узел

<xsl:apply-templates />

Попробуйте это XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
    <xsl:template match="/*">
        <html>
            <head>
                <link rel="stylesheet" type="text/css" href="style.css"/>
                <title>All About David Duchovny</title>
            </head>
            <body>
                <header>
                    <h1>All About David Duchovny</h1>
                    <div id="navigation">
                        <nav>
                            <a href="#filmography">filmography</a> | 
                            <a href="#vg">video games</a> | 
                            <a href="#music">music</a> | 
                            <a href="#bookd">books</a> | 
                            <a href="#awards">awards</a>
                        </nav>
                    </div>
                </header>
                <section>
                    <xsl:apply-templates />
                </section>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="filmography">
        <a name="filmography" />
        <div id="filmography">
            <h2>Filmography</h2>
            <h3>Movies</h3>
            <xsl:for-each select="//film">
                <p><xsl:value-of select="film/info1/@title"/></p>
            </xsl:for-each>
        </div>
    </xsl:template>

    <xsl:template match="vg">
        <h2>vg goes here</h2>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...