Глубина рекурсии и разный разбор

0

Я новичок в 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>
  • 0
    Почему бы вам не дать нам подсказку относительно ожидаемого результата? Использование примера с несколькими вложенными подразделами было бы полезно в этом.
Теги:
xslt
parsing

2 ответа

1
Лучший ответ

ну, что я пытаюсь сделать, это установить 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>

Изменить 2:

im должен был установить h2-h5 для первого 4, а h6 после этого.

Если вы хотите ограничить заголовок максимумом h6 независимо от глубины раздела, измените это:

    <xsl:with-param name="depth" select="$depth + 1"/>

чтобы:

    <xsl:with-param name="depth" select="$depth + ($depth &lt; 6)"/>
  • 0
    похоже, я мог бы адаптировать его к своим потребностям, подраздел не называется подразделом, это просто раздел как дочерний элемент другого раздела. я должен установить h2-h5 для первых 4, а h6 после этого.
  • 0
    @DanielBo «я должен установить h2-h5 для первых 4, а h6 после этого ». Боюсь, это не имеет смысла для меня. Я снова предлагаю вам отредактировать свой вопрос и предоставить минимальный, но полный пример как ввода, так и требуемого вывода.
Показать ещё 3 комментария
1

Вы можете попробовать переделать "count (ancestor :: *)", если вы действительно хотите знать, насколько вы глубоки. Тем не менее, я бы предложил сначала взглянуть на автоматическую нумерацию, на всякий случай, если это трюк. Он даже обрабатывает вложенные элементы довольно удобно.

"XSLT xsl: инструкция номера упрощает вставлять номер в ваш результирующий документ. Его атрибут value позволяет вам указать номер для вставки, но если вы действительно хотите добавить определенный номер к вашему результату, гораздо проще добавить этот номер в качестве буквального текста. Когда вы опускаете атрибут value из инструкции xsl: value, XSLT-процессор вычисляет число, основанное на позиции контекстного узла в дереве источников или среди узлов, подсчитываемых посредством команды xsl: for-each, что делает его отличным для автоматической нумерации ".

Справочная страница XML.com

  • 0
    хорошо, что я пытаюсь сделать, это установить h2 для раздела как подраздел для книги, и h3 для подраздела раздела.
  • 0
    Я заметил ваш комментарий в другом ответе (об использовании H2-H6). Вы можете сделать <xsl: choose>, который проверяет уровень вложенности (предок или число, в зависимости от того, какой метод вы используете), и пусть H6 будет выбором по умолчанию. Похоже, вариант предка может быть вашей самой простой ставкой, в этом случае.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню