Re: layout for entries in one group

"M. Niedermair" <[email protected]> Mon, 20 Feb 2006 22:00:35 +0100
Newsgroups gmane.comp.openoffice.devel.xml
Message-ID <[email protected]>
Hi Svante,

> you might do the following:
[...]
Sorry, but the solution dont work.

with this example

<?xml version="1.0" encoding="ISO-8859-1"?>
<a>
    <p style-name="Standard">Dies ist ein Text</p>
    <p style-name="Standard"/>
    <p style-name="listing">public class Test {</p>
    <p style-name="listing"> // ...</p>
    <p style-name="listing">}</p>
    <p style-name="Standard"/>
    <p style-name="Standard">noch eins</p>
    <p style-name="listing">public class Test {</p>
    <p style-name="listing"> // ...</p>
    <p style-name="listing">}</p>
</a>

i get the result with your xsl-file.
<?xml version="1.0"?>
<x>
    <p>Dies ist ein Text</p>
    <p></p>
    <listing>
       <p>public class Test {</p>
       <p> // ...</p>
    </listing>
    <p></p>
    <p>noch eins</p>
</x>

but now i get a solution per email that works.

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="p[@style-name='listing']">
       <xsl:if
          test="preceding-sibling::*[1][not(self::p)] or 
preceding-sibling::*[1][self::p[@style-name != current()/@style-name]]">
          <xsl:element name="listing">
             <xsl:apply-templates select="." mode="copy"/>
          </xsl:element>
       </xsl:if>
    </xsl:template>

    <xsl:template match="p[@style-name='listing']" mode="copy">
       <xsl:copy>
          <xsl:apply-templates/>
       </xsl:copy>
       <xsl:apply-templates
          select="following-sibling::*[1][self::p[@style-name = 
current()/@style-name]]"
          mode="copy"/>
    </xsl:template>

    <xsl:template match="@* | node()">
       <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
       </xsl:copy>
    </xsl:template>

</xsl:stylesheet>


the result is:
<?xml version="1.0"?>
<a>
    <p style-name="Standard">Dies ist ein Text</p>
    <p style-name="Standard"/>
    <listing>
       <p>public class Test {</p>
       <p> // ...</p>
       <p>}</p>
    </listing>
    <p style-name="Standard"/>
    <p style-name="Standard">noch eins</p>
    <listing>
       <p>public class Test {</p>
       <p> // ...</p>
       <p>}</p>
    </listing>
</a>

Thank you
By
Michael