Хобрук: Ваш путь к мастерству в программировании

XML не будет отображать все теги внутри тега

Проблема:

У нас есть документ XML, который показывает много текста. Этот текст заключен в теги -p, а все заключено в тег с именем -avsnitt-. Однако будет отображаться только первый -p-тег в каждом -avsnitt-.

XML-код:

<seksjon>
<p>3.1. Introduction</p>
<avsnitt>
<p>SIMULA is a general purpose programming language. It inherits the algorithmic properties of ALGOL 60 and introduces methods for structuring data. The main characteristic of SIMULA is that it is easily modelled towards specialized problem areas, and hence can be used as a basis for Special Application Languages.</p>

<p>In this Standard the name SIMULA is considered synonymous with SIMULA 67. Although there exists a predecessor, SIMULA I, this latter language has achieved limited use. It is recommended that the language defined in this Standard be referred to as "Standard SIMULA".</p>

<p>SIMULA includes most of the ALGOL 60 language. Wherever ALGOL is used in this Standard it relates to the STANDARD ALGOL 60 definition (ISO 1538).</p>
</avsnitt>
</seksjon>

XSL-код:

<xsl:for-each select="kapittel/seksjon">
<h2><xsl:value-of select="p"/></h2>
<br></br>
<xsl:value-of select="avsnitt/p"/>
</xsl:for-each>
30.10.2013

Ответы:


1

Предыдущий ответ действительно самый компактный. Просто для полноты я предложу подробное решение, часто встречающееся, когда XML и таблицы стилей становятся более сложными.

<xsl:template match="/parent-of-seksjons">
  <xsl:apply-templates select="seksjon"/> <!-- this was your xsl:for-each -->
</xsl:template>

<xsl:template match="seksjon">
  <xsl:apply-templates/>  <!-- basically, filter the seksjon tag from output -->
</xsl:template>

<!-- (1) matches any p tag directly beneath seksjon -->
<xsl:template match="seksjon/p">
  <!-- it's bad practice to <br/> just for whitespace -->
  <h2 style="margin-bottom: 2em"><xsl:value-of select="."/></h2>
</xsl:template>

<xsl:template match="avsnitt">
  <xsl:apply-templates/>  <!-- again, filter the tag but keep it's children -->
</xsl:template>

<!-- (2) matches any p tag directly beneath avsnitt -->
<xsl:template match="avsnitt/p">
  <xsl:copy>
    <xsl:apply-templates select="@*|*"/>
  </xsl:copy>
</xsl:template>

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

Кстати, я бы использовал не <seksjon><p>, а <seksjon title=".."/> или даже <seksjon><title>, если это возможно.

Если это слишком многословно, вы можете просто добавить шаблон (1) и шаблон (2) в свой XSL и заменить <xsl:value-of на <xsl:apply-templates.

30.10.2013

2

Это правильно, если вы используете XSLT 1.0, потому что value-of при указании набора узлов, содержащего более одного узла, вернет строковое значение первого узла в наборе в порядке документа. Вероятно, вы захотите использовать copy-of вместо value-of, что скопирует все выбранные узлы в результирующее дерево.

<xsl:for-each select="kapittel/seksjon">
<h2><xsl:value-of select="p"/></h2>
<br></br>
<xsl:copy-of select="avsnitt/p"/>
</xsl:for-each>

Это приведет к выводу, как

<h2>3.1. Introduction</h2>
<br />
<p>SIMULA is a general purpose programming language. It inherits the algorithmic properties of ALGOL 60 and introduces methods for structuring data. The main characteristic of SIMULA is that it is easily modelled towards specialized problem areas, and hence can be used as a basis for Special Application Languages.</p>
<p>In this Standard the name SIMULA is considered synonymous with SIMULA 67. Although there exists a predecessor, SIMULA I, this latter language has achieved limited use. It is recommended that the language defined in this Standard be referred to as "Standard SIMULA".</p>
<p>SIMULA includes most of the ALGOL 60 language. Wherever ALGOL is used in this Standard it relates to the STANDARD ALGOL 60 definition (ISO 1538).</p>
30.10.2013
  • Благодарю вас! Работает как шарм! 30.10.2013
  • Новые материалы

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..