XSLT и wkhtmltopdf TOC Применение различных шаблонов к элементу с разной глубиной - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь перебрать элементы внутри элементов в контуре оглавления, сгенерированного wkhtmltopdf, и применить к каждому свой стиль.

Одна вещь, которую я попробовал, состоит в следующем с 3 различными шаблонами:

<xsl:template match="outline:outline">
    <xsl:apply-templates select="outline:item/outline:item"/>
</xsl:template>

<xsl:template match="outline:item/outline:item">
    <xsl:if test="((@title!='') and (@title!='Table of Contents'))">
        <div style="width: 30%;">
            <h1> <xsl:value-of select="@title" /> </h1>
        </div>
        <div style="width: 70%;">
            <xsl:apply-templates select="outline:item"/>
        </div>
    </xsl:if>
</xsl:template>
<xsl:template match="outline:item/outline:item/outline:item">
    <h2> <xsl:value-of select="@title" /> </h2>
    <ul class="leaders">
        <xsl:apply-templates select="outline:item"/>
    </ul>
</xsl:template>
<xsl:template match="outline:item/outline:item/outline:item/outline:item">
    <li>
        <h3>
            <a>
                <xsl:if test="@link">
                    <xsl:attribute name="href"><xsl:value-of select="@link"/></xsl:attribute>
                </xsl:if>
                <xsl:if test="@backLink">
                    <xsl:attribute name="name"><xsl:value-of select="@backLink"/></xsl:attribute>
                </xsl:if>
                <span> <xsl:value-of select="@title" /> </span>
                <span> <xsl:value-of select="@page" /> </span>
            </a>
        </h3>
    </li>
</xsl:template>

Я также пытался применять шаблоны по режиму или по другим причинам. Еще один, который я пробовал - это использовать 3 <xsl:for-each> внутри друг друга. В качестве ссылки, это пример xml, который генерируется wkhtmltopdf.

<?xml version="1.0" encoding="UTF-8"?>
<outline xmlns="http://wkhtmltopdf.org/outline">
    <item title="" page="0" link="" backLink=""/>
    <item title="" page="1" link="__WKANCHOR_0" backLink="__WKANCHOR_1">
        <item title="Table of Contents" page="3" link="__WKANCHOR_2" backLink="__WKANCHOR_3">
            <item title="H2 Test" page="3" link="test" backLink="test">
                <item title="H3 Test" page="3" link="test" backLink="test"/>
            </item>
        </item>
        <item title="Example Page 1" page="4" link="__WKANCHOR_4" backLink="__WKANCHOR_5"/>
        <item title="Example Page 2" page="5" link="__WKANCHOR_6" backLink="__WKANCHOR_7"/>
    </item>
</outline>

МОЙ ВОПРОС: Какой правильный способ сделать это и заставить его работать с wkhtmltopdf? Пока что с wkhtmltopdf я не получаю никакого вывода для этой части Страница оглавления. С моим собственным парсером XSLT я получаю только вывод <h1> и больше ничего. Как я могу это исправить?

EDIT

Согласно запросу, это пример желаемого результата. Он очень упрощен, как и приведенный выше код, но в целом это то, как я хочу, чтобы он выглядел, с правильными шрифтами и другим стилем.

<html>
    <head>
        <style>
            body {
                margin: 0 1in;
            }
            ul {
                list-style: none;
                margin: 0;
                padding: 0;
                overflow-x: hidden;
            }
            ul.leaders li:before {
                float: left;
                width: 0;
                white-space: nowrap;
                color: #003963;
                font-size: 1.6rem;
                content:
                        "........................................"
                        "........................................"
                        "........................................"
                        "........................................"
                        "........................................";
            }
            ul.leaders span:first-child {
                padding-right: 0.33em;
                background: white;
            }
            ul.leaders span + span {
                float: right;
                padding-left: 0.33em;
                background: white;
                position: relative;
                z-index: 10;
                font-size: 1rem;
            }
            ul.leaders span {
                margin-top: 0.5rem;
            }
            h1 {
                text-align: center;
                color: #96D1F2;
            }
            h2 {
                color: #F15A22;
            }
            h3 {
                color: #003963;
                text-transform: uppercase;
            }
        </style>
    </head>
    <body>
        <div>
            <div style="width: 30%; float: left; display: inline-block;">
                <h1>Big section</h1>
            </div>
            <div style="width: 70%; float: right; display: inline-block;">
                <h2>Sorta Big section</h2>
                <ul class="leaders">
                    <li>
                        <h3>
                            <span>Smaller Section</span>
                            <span>2</span>
                        </h3>
                    </li>
                    <li>
                        <h3>
                            <span>Smaller Section 2</span>
                            <span>3</span>
                        </h3>
                    </li>
                    <li>
                        <h3>
                            <span>Smaller Section 3</span>
                            <span>4</span>
                        </h3>
                    </li>
                </ul>
            </div>
        </div>
    </body>
</html>

РЕДАКТИРОВАТЬ 2: Я сделал обновление, предложенное в ответе ниже, и оно исправило его для моего синтаксического анализатора в IntelliJ IDEA (моя IDE), но оно по-прежнему имеет ту же проблему, что и в wkhtmltopdf, где оно просто зависает при достижении этапа TOC.

1 Ответ

1 голос
/ 22 марта 2019

Вы должны изменить свой xsl:if во втором шаблоне с

<xsl:if test="((@title!='') and (@title!='Table of Contents'))">

до

<xsl:if test="@title!=''">

Тогда ваш вывод изменится на

<div style="width: 30%;">
    <h1>Table of Contents</h1>
</div>
<div style="width: 70%;">
    <h2 xmlns:outline="http://wkhtmltopdf.org/outline">H2 Test</h2>
    <ul xmlns:outline="http://wkhtmltopdf.org/outline" class="leaders">
        <li>
            <h3>
                <a href="test" name="test">
                    <span>H3 Test</span>
                    <span>3</span>
                </a>
            </h3>
        </li>
    </ul>
</div>
<div style="width: 30%;">
    <h1>Example Page 1</h1>
</div>
<div style="width: 70%;"/>
<div style="width: 30%;">
    <h1>Example Page 2</h1>
</div>
<div style="width: 70%;"/>

, что довольно близко к желаемому результату.
Я не мог улучшить шаблоны дальше, потому что ваш желаемый результат отличается слишком обширным. Но я думаю, что теперь вы можете ладить.

...