Я застрял с преобразованием XML в XML с использованием XSLT 2.0, где мне нужно преобразовать это:
<p>some mixed content <x h="">START:attr="value"</x> more mixed content <x h="">END</x> other mixed content</p>
В это:
<p>some mixed content <ph attr="value"> more mixed content </ph> other mixed content</p>
Так что в основном я хотел бызамените <x h="">START:attr="value"</x>
на <ph attr="value">
и <x h="">END</x>
на </ph>
и обработайте все остальное как обычно.
Кто-нибудь знает, возможно ли это?
Моя основная проблема заключается в том, что я не могу понять, как найти элемент со значением END, а затем указать процессору XSLT (я использую saxon) обработать содержимое между первым и вторым появлением и, наконец,написать конечный элемент. Я знаком с тем, как создать элемент (включая атрибуты).
У меня есть специальный шаблон, соответствующий начальному элементу START: attr = "value". Поскольку обрабатываемый мной XML-документ содержит много других элементов, я бы предпочел рекурсивное решение, поэтому продолжайте обработку найденного содержимого между START и END, используя другие существующие шаблоны.
Образец XML (обратите внимание, что я не знаю заранее, будет ли родитель элементом ap)
<p> my sample text <b>mixed</b> more
<x h="">START:attr="value"</x>
This is mixed content <i>REALLY</i>, process it normally
<x h="">END</x>
</p>
Моя таблица стилей
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="x[@h][starts-with(., 'START:')]">
<ph>
<xsl:for-each-group select="../*" group-starting-with="x[@h][. = 'START:']">
<xsl:for-each-group select="current-group()" group-ending-with="x[@h][. = 'END']">
<xsl:apply-templates select="@*|node()|text()"/>
</xsl:for-each-group>
</xsl:for-each-group>
</ph>
</xsl:template>
<xsl:template match="x[@h][starts-with(., 'END')]"/>
<xsl:template match="node()|@*">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Результат
<?xml version="1.0" encoding="UTF-8"?>
<p> my sample text <b>mixed</b> more
<ph>mixed</ph>
This is mixed content <i>REALLY</i>, process it normally
</p>
Я не могу понять, как поместить весь контент между START и END в тегах. Есть идеи?