Структура, при определенных условиях

Я пробую свои силы в html, но я не знаю, как это сделать. Это мое, но не работает :(:

<xsl:template match = "*[contains(local-name(), '.')]">
  <xsl:element name = "{translate(local-name(), '.', '_')}" namespace = "{namespace-uri()}">
    <xsl:apply-templates select = "@* | node()"/>
  </xsl:element>
</xsl:template>

Кто-нибудь знает, как с этим бороться?

Это действительно так выглядит ваш вход? Или ты какие-то части вырезал? Это не правильно сформированный XML-документ.

michael.hor257k 19.06.2019 09:00

Итак, какой XSLT-процессор или какую версию XSLT вы используете или можете использовать? Похоже, это хорошая работа для XSLT 2/3 и рекурсивной функции с использованием for-each-group group-starting-with.

Martin Honnen 19.06.2019 09:45

Здравствуйте, спасибо за ваш интерес. первый контейнер кода является входным, второй - выходным. ожидается вывод, и я не смог получить его через xslt, просто модифицировав его вручную (это ожидаемый результат)

aliciavika 19.06.2019 10:16

Разметка в виде, например, <li2>Term & Reversion</li2> не является правильно сформированным XML, так как амперсанд необходимо экранировать, как, например, в <li2>Term &amp; Reversion</li2>.

Martin Honnen 19.06.2019 10:30
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
4
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это кажется проблемой рекурсивной группировки, хотя в одном примере на самом деле не указано, когда следует обернуть и/или вложить элементы в виде списков; тем не менее, в XSLT 2 или 3 это можно было бы решить с помощью рекурсивной функции, используя for-each-group:

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
    xmlns:xs = "http://www.w3.org/2001/XMLSchema"
    xmlns:mf = "http://example.com/mf"
    exclude-result-prefixes = "#all"
    version = "3.0">

  <xsl:mode on-no-match = "shallow-copy"/>

  <xsl:output method = "html" indent = "yes" html-version = "5"/>

  <xsl:function name = "mf:wrap" as = "element()*">
      <xsl:param name = "elements" as = "element()*"/>
      <xsl:param name = "level" as = "xs:integer"/>
      <xsl:for-each-group select = "$elements" group-adjacent = "boolean(self::*[matches(local-name(), '^li[' || $level || '-9]+$')])">
          <xsl:choose>
              <xsl:when test = "current-grouping-key()">
                  <ul class = "li{$level}">
                      <xsl:sequence select = "mf:wrap(current-group(), $level + 1)"/>
                  </ul>
              </xsl:when>
              <xsl:otherwise>
                  <xsl:apply-templates select = "current-group()"/>
              </xsl:otherwise>
          </xsl:choose>
      </xsl:for-each-group>
  </xsl:function>

  <xsl:template match = "*[matches(local-name(), '^li[0-9]+$')]">
      <li>
          <xsl:apply-templates/>
      </li>
  </xsl:template>

  <xsl:template match = "*[*[matches(local-name(), '^li[0-9]+$')]]">
      <div>
        <xsl:apply-templates select = "mf:wrap(*, 1)"/>
      </div>
  </xsl:template>

  <xsl:template match = "uz">
      <h5>
          <xsl:apply-templates/>
      </h5>
  </xsl:template>

  <xsl:template match = "/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bnnZWK

Обратите внимание, что структура списка, созданная выше, немного отличается, все liX элементы одного и того же X уровня завернуты в одну ul class = "liX" оболочку, в то время как ваш желаемый образец в некоторых местах, кажется, оборачивает несколько элементов, а в других местах оборачивает только отдельные элементы.

Другие вопросы по теме