Чтобы объединить «начальный» <p>
элемент (без merge
attribute = 'Y') со следующими <p>
элементами (с merge
attribute = 'Y'), вам необходим шаблон, соответствующий "p".
Внутри этого шаблона должно быть <xsl:if test="not(@merge = 'Y')">
для обслуживания только"начальных" элементов.
Инструкция по копированию содержимого должна включать:
- текущий элемент,
- после
<p>
братьев и сестер с @merge = 'Y'
(предикат № 1), - , но только с «прямыми братьями и сестрами», т.е. не предшествует другой «начальный»«Элемент
<p>
(предикат № 2), - с пустым
separator
(по умолчанию это пробел).
Таким образом, скрипт работает нормально, даже если у вас есть другой»начальный элемент "<p>
с (другой) следующей последовательностью <p>
элементов, подлежащих объединению (как в моем примере, приведенном ниже).
Таким образом, сценарий XSLT может быть следующим:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="p">
<xsl:if test="not(@merge = 'Y')">
<xsl:copy>
<xsl:value-of select="., following-sibling::p[@merge = 'Y']
[generate-id(preceding-sibling::p[not(@merge = 'Y')][1])
= generate-id(current())]"
separator=""/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:transform>
Рабочий пример см. http://xsltfiddle.liberty -development.net / gWmuiJZ
В XSLT 1.0 некоторые изменения необходимыded, потому что value-of
в версии 1.0 работает немного по-другому (и не поддерживает атрибут separtor
).Чтобы обойти эту проблему, вы должны использовать отдельный value-of
для текущего элемента и for-each
loop (с другим value-of
) для следующих братьев и сестер.
Пример в версии 1.0 см. http://xsltransform.net/3MEbY7K