Как можно сгруппировать ТЕКСТ / ЭЛЕМЕНТ с помощью xsl: для каждого элемента группы в XSLT 2.0

#xslt-2.0

#xslt-2.0

Вопрос:

ВВЕДИТЕ XML:

 <overline-start id="tie1" specific-use="tie-bar"/>PtCl<sub>2</sub>(P((CH<sub>2</sub>)<sub><italic toggle="yes">n</italic></sub>)<sub>3</sub><overline-end rid="tie1"/>
  

ОЖИДАЕМЫЙ XML:

 <overline id="tie1" specific-use="tie-bar">PtCl<sub>2</sub>(P((CH<sub>2</sub>)<sub><italic toggle="yes">n</italic></sub>)<sub>3</sub></overline>
  

МОЙ код XSLT 2.0:

 <xsl:template match="overline-start">
<xsl:for-each-group select="self::overline-start" group-adjacent="self::overline-start[following-sibling::overline-end]">
<xsl:for-each select="current-group()">
<overline>
<xsl:apply-templates select="@*"/>
<xsl:copy-of select="current-group()"/>
</overline>
</xsl:for-each>
  

Комментарии:

1. Нет ли какого-либо родительского элемента контейнера для элементов overline-start и overline-end ? Кажется, вы должны сопоставить этот элемент родительского контейнера, и тогда он станет классическим, используемым в учебниках xsl:for-each-group select="node()" group-starting-with="overline-start" вместе с вложенным xsl:for-each-group group-ending-with="overline-end" . Не уверен, нужно ли вам также сравнивать атрибуты id и tid .

2. В настоящее время он находится под элементом ‘p’, но это может быть другой родительский элемент, да, мы сравниваем идентификатор и rid

3. Я думаю, что простого примера недостаточно для объяснения ваших требований. Могут ли быть различные overline-start элементы в общем родительском элементе? Могут ли быть несоответствующие overline-start/end элементы (например <overline-start id="o1"/><foo/>...<bar/></overline-end rid="o2"/> )? Что произойдет в этом случае?

4. Но здесь требуется атрибут select, если мы используем вложенный xsl:для каждой группы, заканчивающейся на=»конец строки»

5. на данный момент он вообще попадает под элемент p

Ответ №1:

Поскольку вы упомянули требование в комментариях, я попробовал это по методу @Martin Honnen:

Предполагая, что ввод в виде:

 <?xml version="1.0" encoding="UTF-8"?>
<p>
      <overline-start id="tie1" specific-use="tie-bar"/>PtCl<sub>2</sub>(P((CH<sub>2</sub>)<sub><italic toggle="yes">n</italic></sub>)<sub>3</sub><overline-end rid="tie1"/>
</p>
  

Решение 2.0 может быть:

 <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="no" />

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="p">
    <overline>
        <xsl:for-each-group select="* | text()" group-starting-with="overline-start">
            <xsl:for-each-group select="current-group()" group-ending-with="overline-end">
                <xsl:apply-templates select="@*" />
                <xsl:sequence select="(current-group() except .) [position() != last()]" />
            </xsl:for-each-group>
        </xsl:for-each-group>
    </overline>
</xsl:template>
</xsl:stylesheet>
  

http://xsltfiddle.liberty-development.net/bnnZW8/1

Комментарии:

1. Я бы подумал, что конструкция overline результирующего элемента относится к вложенному, for-each-group где вы создали группу и хотите обернуть ее в overline элемент.

2. @MartinHonnen : Но разве это не означало бы создание нескольких <overline> элементов, включая начальный и конечный?

3. Я подозреваю, что задача в целом состоит в том, чтобы идентифицировать узлы между парами overline-start / overline-end и обернуть их в overline элементы. Все сложно сказать на этом простом примере, где есть только эта единственная последовательность.

4. @Javed: На самом деле существует множество экземпляров (т. Е. См. Пример ввода), входящих в один элемент ‘p’, возможно ли сгруппировать каждый экземпляр под элементом overline’. мы сопоставляем шаблон ‘overline-start’ здесь.

5. @Javed: Спасибо, Вебби, но он не работает должным образом, возможно ли сопоставить шаблон ‘overline-start’