Nano Hash - криптовалюты, майнинг, программирование

Цикл XSLT for-each, в котором каждый узел является отдельным элементом

Я создаю блог-сайт для школьного проекта. Содержание сообщения в блоге состоит из ряда элементов, каждый из которых может быть либо простым текстом, ссылками, изображениями или видео. Все эти элементы должны отображаться в том порядке, в котором они хранятся в файле XML, и каждый из них будет отображаться в новом теге <p>.

Следовательно, идея состоит в том, чтобы каким-то образом зациклить все эти элементы, и каждая итерация должна выполнять `xsl:choose, чтобы решить, как отображать элемент текущей итерации.

Возьмем, к примеру, этот код: как заставить его выполнять только часть TEXT, когда элемент имеет тип b:blogPostContent/b:blogPostText, и часть LINK, когда элемент имеет тип b:blogPostContent/b:blogPostLink?

<xsl:for-each select="b:blogPostContent/*">
    <p>

        <!--TEXT-->
        <xsl:value-of select="."/>

        <!--LINK-->
        <xsl:element name="a">
            <xsl:attribute name="href">
                <xsl:value-of select="./@target"/>
            </xsl:attribute>
            <xsl:attribute name="target">
                _blank
            </xsl:attribute>
            <xsl:value-of select="."/>
        </xsl:element>

    </p>
</xsl:for-each> 
16.01.2014


Ответы:


1

Используйте элемент choose следующим образом:

<xsl:choose>
  <xsl:when test="name() = 'b:blogPostText'">
    <xsl:value-of select="."/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:element name="a">
        <xsl:attribute name="href">
            <xsl:value-of select="./@target"/>
        </xsl:attribute>
        <xsl:attribute name="target">_blank</xsl:attribute>
        <xsl:value-of select="."/>
    </xsl:element>
  </xsl:otherwise>
</xsl:choose>

Другая возможность — сопоставить эти элементы в отдельных шаблонах. Допустим, ваш шаблон соответствует элементу b:blogPostContent (на самом деле вы не показали структуру входного XML):

<xsl:template match="b:blogPostContent">
   <p>
     <xsl:apply-templates select="b:blogPostText|b:blogPostLink"/>
   </p> 
</xsl:template>

<xsl:template match="b:blogPostText">
  <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="b:blogPostLink">
  <a>
     <xsl:attribute name="href">
         <xsl:value-of select="./@target"/>
     </xsl:attribute>
     <xsl:attribute name="target">_blank</xsl:attribute>
     <xsl:value-of select="."/>
  </a>
</xsl:template>

Обратите внимание, что <xsl:element name="a"> точно такое же, как <a>. Поэтому я сократил запись. (В любом случае это было непоследовательно, так как вы не написали <xsl:element name="p">).

16.01.2014
  • Обязательно используйте отдельные шаблоны 16.01.2014

  • 2

    Следовательно, идея состоит в том, чтобы каким-то образом зациклить все эти элементы, и каждая итерация должна выполнять xsl:choose, чтобы решить, как отображать элемент текущей итерации.

    Идея неплохая, но движимая императивным образцом мышления. XSLT не является императивным языком, и в большинстве случаев лучше следовать декларативным шаблонам.

    <xsl:template match="b:blogPostContent">
      <article>
        <xsl:apply-templates select="*" mode="wrap_p" />
      </article>
    </xsl:template>
    
    <xsl:template select="*" mode="wrap_p">
      <p>
        <xsl:apply-templates select="." />
      </p>
    </xsl:template>
    
    <xsl:template match="b:blogPostText">
      <xsl:value-of select="." />
    </xsl:template>
    
    <xsl:template match="b:blogPostLink">
      <a href="{@target}" target="_blank">
        <xsl:value-of select="."/>
      </a>
    </xsl:template>
    
    <xsl:template match="b:blogPostList">
      <ul>
        <xsl:apply-templates select="*" />
      </ul>
    </xsl:template>
    

    и так далее.

    Таким образом, вы получаете небольшие специализированные модульные шаблоны, которые выполняют одну и только одну функцию, в то время как механизм XSLT решает, какой шаблон лучше всего подходит для того или иного входного узла.


    Обратите внимание, что вам никогда не нужно писать <xsl:element> или <xsl:attribute>, если только вы не хотите создавать их динамически (например, имена на основе переменных). Если вы хотите, чтобы на выходе было <a>, просто поместите <a> в XSLT.

    16.01.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..