Редактировать : В своем первоначальном ответе (ниже) я думал, что значение атрибута select
должно быть шаблоном, и теперь я вижу, что спецификация вводит меня в заблуждение.
В этом случае описанное поведение, скорее всего, является ошибкой.
@ Джахангир, поздравляем с обнаружением ошибки по крайней мере в трех процессорах XSLT 2.0.
Спецификация W3C XSLT 2.0 гласит (об атрибуте select
xsl:for-each-group
):
"• Если присутствует атрибут начального числа группы, то его значение должно бытьpattern. "
А правила для шаблона разрешают использование только осей child::
или attribute::
в шаблоне.
Следовательно, descendant::*
не допускается в качестве шаблона .Я полагаю, что процессор XSLT воспринимает это как «исправляемую ошибку» и выполняет свое собственное действие в качестве восстановления.
Решение состоит в том, чтобы поместить первый элемент milestone
на его место в качестве ближайшего следующего брата * 1031.* и измените select attribute of
xsl: для каждой группы to:
div / * `:
<text>
<body>
<div>
<milestone unit="fragment"/>
<p>First line text in FIRST fragment</p>
<p>Second line
<seg>text in FIRST</seg> fragment
</p>
<p>Third line text in FIRST fragment</p>
<milestone unit="fragment"/>
<p>First line text in SECOND fragment</p>
<p>Second line
<seg>text in SECOND </seg> fragment
</p>
<p>Third line text in SECOND fragment</p>
<milestone unit="fragment"/>
<p>First line text in THIRD fragment</p>
<p>Second line
<seg>text in THIRD </seg> fragment
</p>
<p>Third line text in THIRD fragment</p>
</div>
</body>
</text>
и:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="html" name="html" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" include-content-type="no"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="body">
<xsl:for-each-group select="div/*" group-starting-with="milestone[@unit='fragment']">
<xsl:variable name="currFragNumber">
<xsl:number count="milestone[@unit='fragment']" level="any" from="text"/>
</xsl:variable>
<xsl:result-document href="{$currFragNumber}.html" format="html">
<xsl:apply-templates select="current-group()" />
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="seg">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:stylesheet>