Почему мой XSL выводит братьев и сестер как потомков пустого элемента? - PullRequest
0 голосов
/ 27 апреля 2018

С учетом следующего XML:

    <text>
        <h6>Title</h6>
        <p>Text is right here</p>
        <h6>Title</h6>
        <p>Text is right here</p>
        <pagebreak orientation="portrait@1col" />
        <h2>This is an H2 Title</h2>
        <figure-gallery>
            <figure>
                <figure-headline>Headline</figure-headline>
                <figure-asset>Image tag to display image</figure-asset>
                <figure-caption>Caption of the image</figure-caption>
            </figure>
            <figure>
                <figure-headline>Headline</figure-headline>
                <figure-asset>Image tag to display image</figure-asset>
                <figure-caption>Caption of the image</figure-caption>
            </figure>
        </figure-gallery>
        <h1>This is an H1 title</h1>
    </text>

И следующий XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan">


<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="pagebreak[1]">
    <div id="empty-html-container" />
</xsl:template>


<xsl:template match="h6">
    <div class="Title">
        <xsl:apply-templates select="@*|node()"/>
    </div>
</xsl:template>

<xsl:template match="p">
    <div class="Text">
        <xsl:apply-templates select="@*|node()"/>
    </div>
</xsl:template>

<xsl:template match="figure-asset">
    <xsl:apply-templates select="@*|node()"/>
</xsl:template>

<xsl:template match="figure">
    <div>
        <header>
            <xsl:copy-of select="figure-headline/p/node()"/>
        </header>
        <section>
            <xsl:apply-templates select="figure-asset"/>
        </section>
        <footer>
            <xsl:value-of select="figure-caption"/>
        </footer>
    </div>
</xsl:template>

<xsl:template match="figure-gallery">
    <div class="figure-gallery">
        <xsl:apply-templates/>
    </div>
</xsl:template>

Почему выходные данные выглядят так (родственные элементы после разрыва страницы являются дочерними элементами вывода шаблона разрыва страницы) ...

<section>
    <div class="Title">Title</div>
    <div class="BulletText">Text is right here</div>
    <div class="BulletTitle">Title</div>
    <div class="BulletText">Text is right here</div>
    <div class="BulletTitle">Title</div>
    <div class="BulletText">Text is right here</div>
    <div id="empty-html-container">
        <h2>This is an H2 Title</h2>
        <div class="figure-gallery">
            <div>
                <header>Headline</header>
                <section>Image tag to display image</section>
                <footer>Caption of the image</footer>
            </div>
            <div>
                <header>Headline</header>
                <section>Image tag to display image</section>
                <footer>Caption of the image</footer>
            </div>
        </div>
        <h1>This is an H1 title</h1>
    </div>
</section>

... вместо того, чтобы выглядеть так (элементы одного уровня после разрыва страницы остаются элементами одного уровня после разрыва страницы):

<section>
    <div class="Title">Title</div>
    <div class="BulletText">Text is right here</div>
    <div class="BulletTitle">Title</div>
    <div class="BulletText">Text is right here</div>
    <div class="BulletTitle">Title</div>
    <div class="BulletText">Text is right here</div>
    <div id="empty-html-container"></div>
    <h2>This is an H2 Title</h2>
    <div class="figure-gallery">
        <div>
            <header>Headline</header>
            <section>Image tag to display image</section>
            <footer>Caption of the image</footer>
        </div>
        <div>
            <header>Headline</header>
            <section>Image tag to display image</section>
            <footer>Caption of the image</footer>
        </div>
    </div>
    <h1>This is an H1 title</h1>
</section>

Пустой элемент позволяет JavaScript выполнять некоторую работу после загрузки страницы браузером.

Одна любопытная вещь: когда я помещаю текст внутри "div" в выводе, он будет работать как положено, но если я оставлю его пустым, то братья и сестры станут детьми.

Прямо сейчас у меня есть тег "br", потому что он не отображается и решает мою проблему, но добавляет строку возврата, которую я не хочу, потому что это портит мой дизайн.

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 27 апреля 2018

Добавление <xsl:output method="html" indent="yes" encoding="utf-8"/> после объявления таблицы стилей.

Производит: <div id="empty-html-container"></div>

Найдено в: Пустой тег XML преобразуется в открытую и закрывающую пару тегов

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