Я новичок в xslt. Так что я пытаюсь сделать, разбирает книгу в xml с html. Основной пример - это.
<book>
<title>
Some important title
</title>
<section>
<title>animal</title>
<kw>RealAnimal</kw>
<kw>something|something more about it</tkw>
<para>Some really important facts</para>
<section>
<title>something</title>
<kw>something else</kw>
<para>Enter Text</para>
</section>
<section>
<title>Even more</title>
<kw>and more</kw>
<para>hell of a lot more</para>
</section>
</section>
</book>
раздел может иметь неизвестное количество подразделов. Поэтому, очевидно, мне нужно справиться с этим с помощью recusrion. до сих пор я разработал 2 шаблона, чтобы обрабатывать книгу и раздел, основываясь на моих потребностях.
<xsl:template match="book">
<html>
<body>
<h1><xsl:value-of select="title" /></h1>
<xsl:apply-templates select="section" />
</body>
</html>
</xsl:template>
<xsl:template match="section[title]">
<li><xsl:value-of select="title" /></li>
<!-- do something more here -->
</xsl:template>
что я не могу понять, могу ли я получить текущую глубину рекурсии, потому что я хочу принять решение, какой тип заголовка использовать на основе глубины.
Кроме того, книга должна состоять из 2 частей. его нормальный контент в начале, например заголовок и пара под этим заголовком. и индекс в конце. Это заставляет меня думать, что мне нужно разобрать его по-разному в одном документе, но как мне это сделать? Любые подсказки или код были бы весьма полезны
поэтому я понял, как создавать заголовки разделов и подсетей с номерами, подобными списку в Word.
<xsl:number level="multiple" />
дает мне подзаголовок xy baseend на позиции раздела родителей и его собственную позицию. что я сейчас хочу, так это то, что он дает мне количество групп, поскольку он группирует значения на основе глубины, но я не могу понять, как
то, что ожидают, это то, что он анализирует
<h1>Some important title</h1>
...
<h2> animal </h2>
...
<h3> something </h3>
...
<h3> Even more </h3>
и если бы я добавил еще один раздел к "что-то" -section, это было бы h4 и так далее...
<xsl:param name="depth"/>
<xsl:choose>
<xsl:when test="6 > $depth">
<xsl:element name="h{$depth}">
<xsl:number level="multiple" />.
<xsl:value-of select="title" />
</xsl:element>
</xsl:when>
<xsl:otherwise>
<h6><xsl:number level="multiple" />. <xsl:value-of select="title" /></h6>
</xsl:otherwise>
</xsl:choose>
ну, что я пытаюсь сделать, это установить h2 для раздела в качестве подраздела для книги, а h3 для подраздела раздела
Здесь один из способов сделать это - с неограниченным вложением подразделов:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/book">
<html>
<body>
<h1><xsl:value-of select="title" /></h1>
<xsl:apply-templates select="section" />
</body>
</html>
</xsl:template>
<xsl:template match="section">
<h2><xsl:value-of select="title" /></h2>
<xsl:apply-templates select="subsection">
<xsl:with-param name="depth" select="3"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="subsection">
<xsl:param name="depth"/>
<xsl:element name="h{$depth}">
<xsl:value-of select="title" />
</xsl:element>
<xsl:apply-templates select="subsection">
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, что это рекурсивное и неограниченное; AFAIK, HTML закончит уровни после h6
.
подразделение не называется подразделением, это просто раздел как дочерний элемент другого раздела.
Ну, тогда это может быть проще. Или, по крайней мере, короче.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/book">
<html>
<body>
<h1><xsl:value-of select="title" /></h1>
<xsl:apply-templates select="section">
<xsl:with-param name="depth" select="2"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="section">
<xsl:param name="depth"/>
<xsl:element name="h{$depth}">
<xsl:value-of select="title" />
</xsl:element>
<xsl:apply-templates select="section">
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
im должен был установить h2-h5 для первого 4, а h6 после этого.
Если вы хотите ограничить заголовок максимумом h6
независимо от глубины раздела, измените это:
<xsl:with-param name="depth" select="$depth + 1"/>
чтобы:
<xsl:with-param name="depth" select="$depth + ($depth < 6)"/>
Вы можете попробовать переделать "count (ancestor :: *)", если вы действительно хотите знать, насколько вы глубоки. Тем не менее, я бы предложил сначала взглянуть на автоматическую нумерацию, на всякий случай, если это трюк. Он даже обрабатывает вложенные элементы довольно удобно.
"XSLT xsl: инструкция номера упрощает вставлять номер в ваш результирующий документ. Его атрибут value позволяет вам указать номер для вставки, но если вы действительно хотите добавить определенный номер к вашему результату, гораздо проще добавить этот номер в качестве буквального текста. Когда вы опускаете атрибут value из инструкции xsl: value, XSLT-процессор вычисляет число, основанное на позиции контекстного узла в дереве источников или среди узлов, подсчитываемых посредством команды xsl: for-each, что делает его отличным для автоматической нумерации ".