Sie könnten hier eine Technik namens Muenchian grouping verwenden. In diesem Fall können Sie gruppieren die untergeordneten Knoten eines p
Element durch die Anzahl der lb
Elemente, die sie
<xsl:key name="p-nodes" match="tei:p/node()" use="concat(generate-id(..), '|', count(following-sibling::tei:lb))" />
Um den ersten Knoten in jeder Gruppe folgen, die jede l
repräsentieren werden Sie ausgegeben werden sollen, würden Sie sie wählen wie so ...
<xsl:for-each
select="node()[generate-id() = generate-id(key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[1])]">
und zur Ausgabe der <l>
Tag selbst und die Inhalte der Gruppe, verwenden sie die Taste erneut ...
<l><xsl:apply-templates select="key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[not(self::tei:lb)]" /></l>
Versuchen Sie, diese XSLT (offensichtlich den Namespace für das tei
Präfix zu ändern in Ihrem XML den echten entsprechen)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:tei="tei">
<xsl:output method="xml" indent="yes" />
<xsl:key name="p-nodes" match="tei:p/node()" use="concat(generate-id(..), '|', count(following-sibling::tei:lb))" />
<xsl:template match="tei:div/tei:p">
<lg>
<xsl:variable name="parentId" select="generate-id()" />
<xsl:for-each select="node()[generate-id() = generate-id(key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[1])]">
<l><xsl:apply-templates select="key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[not(self::tei:lb)]" /></l>
</xsl:for-each>
</lg>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
es in Aktion bei http://xsltransform.net/gWEamMf
Hallo. Vielen Dank @ tim-c :) Ich denke, ich habe noch viel mehr über xslt zu lernen. –
Sie können sich auch die Antwort von michael.hor257K ansehen. Es ist sauberer und effizienter. –