|
Subject: [xsl] Grouping with siblings From: "rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 15 Feb 2025 19:49:42 -0000 |
I have a flat file structure and am trying to add structure to it. Here is
my XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<div type="book" sID="book1">
<chapter sID="chapter1" n="1"/>
<p sID="p1.1" n="1"/>Paragraph 1 text.
<p eID="p1.1"/>
<p sID="p1.2" n="2"/>Paragraph 2 text with
<emphasis>emphasis</emphasis> added.
<p eID="p1.2"/>
<p sID="p1.3" n="3"/>Paragraph 3 text.
<p eID="p1.3"/>
<chapter eID="chapter1" n="1"/>
<chapter sID="chapter2" n="2"/>
<p sID="p2.1" n="1"/>Paragraph 1 text.
<p eID="p2.1"/>
<p sID="p2.2" n="2"/>Paragraph 2 text with
<emphasis>emphasis</emphasis> added.
<p eID="p2.2"/>
<p sID="p2.3" n="3"/>Paragraph 3 text.
<p eID="p2.3"/>
<p sID="p2.4" n="4"/>Paragraph 4 with <bold>bold</bold> text.
<p eID="p2.4"/>
<chapter eID="chapter2" n="2"/>
</div>
</root>
My desired output is this:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<chapter number="1">
<title>chapter1</title>
<p>Paragraph 1 text.</p>
<p>Paragraph 2 text with <emphasis>emphasis</emphasis> added.</p>
<p>Paragraph 3 text.</p>
</chapter>
<chapter number="2">
<title>chapter2</title>
<p>Paragraph 1 text.</p>
<p>Paragraph 2 text with <emphasis>emphasis</emphasis> added.</p>
<p>Paragraph 3 text.</p>
<p>Paragraph 4 with <bold>bold</bold> text.</p>
</chapter>
</book>
Here is my current stylesheet. I know I am missing something fundamental
here, but I can't see what it is. Any help would be appreciated.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0" expand-text="yes">
<xsl:output indent="yes"/>
<xsl:template match="/root">
<xsl:apply-templates select="./div[@sID='book1']"/>
</xsl:template>
<xsl:template match="div">
<book>
<xsl:for-each-group
select="*[starts-with(@sID,'chapter')]|text()"
group-starting-with="chapter[@sID]">
<xsl:if test="self::chapter[@sID]">
<chapter number="{@n}">
<title>{@sID}</title>
<xsl:apply-templates select="." mode="group"/>
</chapter>
</xsl:if>
</xsl:for-each-group>
</book>
</xsl:template>
<xsl:template match="chapter" mode="group">
<xsl:for-each-group select="current-group() except ."
group-starting-with="self::p[@sID]">
<xsl:apply-templates select="." mode="group"/>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="p" mode="group">
<p></p>
</xsl:template>
</xsl:stylesheet>
Thank you,
Rick Quatro
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Advantages and disadvanta, Michael B Allen iopl | Thread | Re: [xsl] Grouping with siblings, Graydon graydon@xxxx |
| Re: [xsl] Advantages and disadvanta, Wendell Piez wapiez@ | Date | Re: [xsl] Grouping with siblings, Graydon graydon@xxxx |
| Month |