Я не помню, чтобы отвечал на этот ссылочный вопрос, но ответ, который я дал, - это подход.Вам просто нужно реализовать правила нумерации ...
- Конвертировать
main
в aside
- Для каждого тега
p
добавить атрибут nr
во вновь созданныйpara
тег на основе значения в скобках в первом дочернем текстовом элементе - Преобразование
b
тегов под элементом p
в u
Это второйодин из них несколько сложен, но его можно достичь с помощью этого шаблона, который использует некоторые манипуляции со строками для извлечения числа в скобках
<xsl:template match="p">
<para nr="{substring-before(substring-after(text()[1], '('), ')')}">
<xsl:apply-templates select="@*|node()"/>
</para>
</xsl:template>
(также обратите внимание на использование шаблонов значений атрибутов для создания атрибута)
Вам также понадобится связанный шаблон для удаления номера из первого текстового узла
<xsl:template match="p/text()[1]">
<xsl:value-of select="substring-after(., ')')" />
</xsl:template>
Преобразование b
в u
намного проще, хотя (Это предполагает, что только b
элементы в p
должны быть изменены).
<xsl:template match="p/b">
<u>
<xsl:apply-templates select="@*|node()"/>
</u>
</xsl:template>
Был бы аналогичный шаблон для изменения main
на aside
Попробуйте этоXSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<!-- This is the Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="main">
<aside>
<xsl:apply-templates select="@*|node()"/>
</aside>
</xsl:template>
<xsl:template match="p">
<para nr="{substring-before(substring-after(text()[1], '('), ')')}">
<xsl:apply-templates select="@*|node()"/>
</para>
</xsl:template>
<xsl:template match="p/text()[1]">
<xsl:value-of select="substring-after(., ')')" />
</xsl:template>
<xsl:template match="p/b">
<u>
<xsl:apply-templates select="@*|node()"/>
</u>
</xsl:template>
</xsl:stylesheet>