#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>
Комментарии:
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’