В XSLT 1.0 распространенным вопросом на форумах было, как преобразовать плоский HTML в иерархический XML, который многократно сводился к вложению текста между тегами <br />
в тегах <p>
.
У меня естьаналогичная проблема, которую, я думаю, я частично решил с помощью XSLT 2.0, но для меня это новый подход, и я хотел бы получить второе мнение.
В источнике XHTML разбросано <span class="pageStart"></span>
.Они могут появляться в нескольких разных родительских узлах.Я хочу обернуть все узлы между маркером начала страницы и следующим узлом <page>
.В настоящее время у меня есть решение:
<xsl:template match="*[child::span[@class='pageStart']]">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:for-each-group select="node()"
group-starting-with="span[@class='pageStart']">
<page>
<xsl:apply-templates select="current-group()"/>
</page>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
По крайней мере с этим есть один недостаток - родительский узел маркера получает <page>
в качестве дочернего узла, когда я этого не хочу.В других работах, если в любом месте есть <div>
, в котором есть дочерний маркер страницы, то в качестве непосредственного потомка <div>
создается узел <page>
в дополнение к ожидаемым местоположениям.
IЯ надеялся, что смогу просто сделать правило шаблона <xsl:template match="span[@class='pageStart']">
, но current-group () кажется пустым, что бы я ни пытался.Здравый смысл, который я пробовал, был <xsl:for-each-group select="node()" group-starting-with="span[@class='pageStart']">
.
Есть ли более простой способ решить эту проблему, которую я упускаю?
РЕДАКТИРОВАТЬ
Вот пример ввода:
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head></head>
<body>
<span class="pageStart"/>
<p>...</p>
<div>...</div>
<img />
<p></p>
<span class="pageStart"/>
<div>...</div>
<span class="pageStart"/>
<p>...</p>
<div>
<span class="pageStart"/>
<p>...</p>
<p>...</p>
<span class="pageStart"/>
<div>...</div>
<img/>
</div>
</body>
</html>
Я предполагаю, что последние две вложенные страницы усложняют эту проблему, поэтому я был бы очень рад получить это в качестве вывода или что-то близкое:
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head></head>
<body>
<page>
<span class="pageStart"/>
<p>...</p>
<div>...</div>
<img />
<p></p>
</page>
<page>
<span class="pageStart"/>
<div>...</div>
</page>
<page>
<span class="pageStart"/>
<p>...</p>
<div>
<page>
<span class="pageStart"/>
<p>...</p>
<p>...</p>
</page>
<page>
<span class="pageStart"/>
<div>...</div>
<img/>
</page>
</div>
</page>
</body>
</html>