Я несколько упростил проблему, но я надеюсь, что все-таки понял суть моей проблемы.
Допустим, у меня есть следующий простой XML-файл:
<main>
outside1
===BEGIN===
inside1
====END====
outside2
=BEGIN=
inside2
==END==
outside3
</main>
Затем я могу использовать следующие XSLT 2.0:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="text()">
<xsl:analyze-string select="." regex="=+BEGIN=+">
<xsl:matching-substring>
<section/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:analyze-string select="." regex="=+END=+">
<xsl:matching-substring>
<_section/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
Чтобы преобразовать его в следующее:
<?xml version="1.0" encoding="UTF-8"?>
outside1
<section/>
inside1
<_section/>
outside2
<section/>
inside2
<_section/>
outside3
Вот вопросы:
Несколько регулярных выражений
Есть ли лучший способ сопоставить два разных регулярных выражения, а не вкладывать их в другое, как это было сделано выше?
- Что, если они не так легко встраиваются, как это?
- Могу ли я иметь шаблоны XSL для сопоставления и преобразования совпадений регулярных выражений в
text()
? - В этом случае у меня будет два шаблона, по одному на каждое регулярное выражение
- Если возможно, это будет идеальное решение
Открытие и закрытие элементов в совпадениях с регулярным выражением
Очевидно, вместо:
<section/>
inside
<_section/>
В конечном итоге я действительно хочу:
<section>
inside
</section>
Так как бы вы это сделали??Я не уверен, возможно ли вообще открыть элемент в одном совпадении с регулярным выражением и закрыть его в другом (т. Е. Что, если нет совпадения для более близкого? Результат не будет правильно сформированным XML!), Но это выглядит какЭта задача довольно типична, так как для них должно быть идиоматическое решение.
Примечание: мы можем предположить, что секции не будут перекрываться, и, следовательно, также не будут вкладываться.Мы также можем предположить, что они всегда будут появляться в правильных парах.
Дополнительная информация
Так что, по сути, я пытаюсь добиться того, что в Perl было бы примерно как:
s/=+BEGIN=+/<section>/
s/=+END=+/<\/section>/
Я ищу способ сделать это в XSLT вместо этого, потому что:
- Это было бы более надежно в отношении контекста соответствия регулярному выражению
- (т. Е. Он должен преобразовывать только
text()
узлы)
- Он также был бы более надежным в отношении сопоставления различных объектов XML