Я пробую свои силы в 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>
Кто-нибудь знает, как с этим бороться?
Итак, какой XSLT-процессор или какую версию XSLT вы используете или можете использовать? Похоже, это хорошая работа для XSLT 2/3 и рекурсивной функции с использованием for-each-group group-starting-with.
Здравствуйте, спасибо за ваш интерес. первый контейнер кода является входным, второй - выходным. ожидается вывод, и я не смог получить его через xslt, просто модифицировав его вручную (это ожидаемый результат)
Разметка в виде, например, <li2>Term & Reversion</li2> не является правильно сформированным XML, так как амперсанд необходимо экранировать, как, например, в <li2>Term & Reversion</li2>.






Это кажется проблемой рекурсивной группировки, хотя в одном примере на самом деле не указано, когда следует обернуть и/или вложить элементы в виде списков; тем не менее, в 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" оболочку, в то время как ваш желаемый образец в некоторых местах, кажется, оборачивает несколько элементов, а в других местах оборачивает только отдельные элементы.
Это действительно так выглядит ваш вход? Или ты какие-то части вырезал? Это не правильно сформированный XML-документ.