#xml #xslt #wkhtmltopdf
#xml #xslt #wkhtmltopdf
Вопрос:
Я пытаюсь перебирать элементы внутри элементов в структуре TOC, сгенерированной 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 я не получаю никаких выходных данных для этой части страницы TOC. С моим собственным анализатором XSLT я получаю только <h1>
выходные данные и ничего больше. Как я могу это исправить?
Редактировать
Согласно запросу, это пример желаемого результата. Это супер упрощено, как и приведенный выше код, но в целом это то, на что я хочу, чтобы это выглядело, с соответствующими шрифтами и другим стилем.
<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. Как бы выглядел желаемый вывод XML? И какую версию XSLT вы можете использовать?
2. Я попытался выяснить, какую версию XSLT использует wkhtmltopdf, и лучшее, что я могу найти, это то, что для всего этого используется QtWebKit. Я пытался выяснить, есть ли какая-то ссылка на это, но я не могу ее найти. Что касается вывода XML, я редактирую свой вопрос с помощью примера.
3. Если вы не можете найти какую-либо информацию, было бы безопаснее использовать версию 1.0. Но приоритет должен быть на желаемом результате.
4. » МОЙ ВОПРОС : как правильно это сделать и добиться, чтобы это произошло? » Я думаю, вам нужно перефразировать это.
Ответ №1:
Вы должны изменить свой 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%;"/>
что довольно близко к желаемому результату.
Я не смог улучшить шаблоны дальше, потому что ваш желаемый результат отличается слишком сильно. Но я думаю, что теперь вы можете поладить.