Moin together,

I am relatively new to the matter and now I am faced with the task to solve the following topic.

This is the source document that I get delivered:

<?xml version="1.0" encoding="UTF-8"?>
<tabelle>
    <vorschaupaarungen>
        <vorschaupaarung>
            <spieldatum>Fr. 27.01.2017</spieldatum>
            <spieluhrzeit>15:30</spieluhrzeit>
            <heimmannschaft>Wesel</heimmannschaft>
            <gastmannschaft>Stuttgart</gastmannschaft>
        </vorschaupaarung>
        <vorschaupaarung>
            <spieldatum>Sa. 28.01.2017</spieldatum>
            <spieluhrzeit>16:30</spieluhrzeit>
            <heimmannschaft>Hannover</heimmannschaft>
            <gastmannschaft>Nürnberg</gastmannschaft>
        </vorschaupaarung>
        <vorschaupaarung>
            <spieldatum>Sa. 28.01.2017</spieldatum>
            <spieluhrzeit>17:30</spieluhrzeit>
            <heimmannschaft>Hamburg</heimmannschaft>
            <gastmannschaft>Berlin</gastmannschaft>
        </vorschaupaarung>
        <vorschaupaarung>
            <spieldatum>Sa. 28.01.2017</spieldatum>
            <spieluhrzeit>17:30</spieluhrzeit>
            <heimmannschaft>Basel</heimmannschaft>
            <gastmannschaft>Wien</gastmannschaft>
        </vorschaupaarung>
        <vorschaupaarung>
            <spieldatum>So. 29.01.2017</spieldatum>
            <spieluhrzeit>17:45</spieluhrzeit>
            <heimmannschaft>Baltrum</heimmannschaft>
            <gastmannschaft>Zypern</gastmannschaft>
        </vorschaupaarung>
        <vorschaupaarung>
            <spieldatum>So. 29.01.2017</spieldatum>
            <spieluhrzeit>12:45</spieluhrzeit>
            <heimmannschaft>Sylt</heimmannschaft>
            <gastmannschaft>Helgoland</gastmannschaft>
        </vorschaupaarung>
    </vorschaupaarungen>
</tabelle>

My XSL :

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>
    <xsl:template match="/">
        <doc xml:lang="de">
            <xsl:comment>Termine</xsl:comment>
            <p class="T_termine_fussball">
                <xsl:for-each select="tabelle/vorschaupaarungen/vorschaupaarung">
                    <xsl:if test="spieldatum=spieldatum">
                        <span class="C_termin">
                            <xsl:value-of select="normalize-space(substring(spieldatum,4,7))"/>
                        </span>
                        <span class="C_paarung">
                            <xsl:value-of select="heimmannschaft"/> - <xsl:value-of select="gastmannschaft"/>
                        </span>
                    </xsl:if>
                </xsl:for-each>    
            </p>
        </doc>
    </xsl:template>
</xsl:stylesheet>

Here it is desired that the dates are sorted by date. So the date appears only once. For me, unfortunately, no matter how I try it out:

<?xml version="1.0" encoding="utf-8"?>
<doc xml:lang="de"><!--Termine-->
   <p class="T_termine_fussball">
      <span class="C_termin">27.01.</span>
      <span class="C_paarung">Wesel - Stuttgart</span>
      <span class="C_termin">28.01.</span>
      <span class="C_paarung">Hannover - Nürnberg</span>
      <span class="C_termin">28.01.</span>
      <span class="C_paarung">Hamburg - Berlin</span>
      <span class="C_termin">28.01.</span>
      <span class="C_paarung">Basel - Wien</span>
      <span class="C_termin">29.01.</span>
      <span class="C_paarung">Baltrum - Zypern</span>
      <span class="C_termin">29.01.</span>
      <span class="C_paarung">Sylt - Helgoland</span>
   </p>
</doc>

So SET XML at the end look:

<?xml version="1.0" encoding="utf-8"?>
<doc xml:lang="de">
   <artikel><!--Termine-->
      <p class="T_termine_fussball">
         <span class="C_termin">27.01.</span>
         <span class="C_paarung">Wesel - Stuttgart</span>
         <span class="C_termin">28.01.</span>
         <span class="C_paarung">Hannover - Nürnberg</span>
         <span class="C_paarung">Hamburg - Berlin</span>
         <span class="C_paarung">Basel - Wien</span>
         <span class="C_termin">29.01.</span>
         <span class="C_paarung">Baltrum - Zypern</span>
         <span class="C_paarung">Sylt - Helgoland</span>
      </p>
   </artikel>
</doc>

Can someone give me a hint how to get to my SOLL XML?
I also do not get along great with the search on the web - I probably only have one mistake here.
Maybe someone can help quickly.

Thanks in advance
Marshall

Dani AI

Generated

A direct, robust approach is to group the match nodes by the normalized date and then sort those groups by a canonical date value. ’s preceding-sibling trick is a simple way to avoid repeating a date, but it only works reliably if the input is already ordered by date and the date text is consistently formatted. For real-world feeds it’s safer to extract the numeric date (dd.mm.yyyy), turn that into a YYYY‑MM‑DD value for sorting, then emit the date once and iterate the group for pairings.

The compact XSLT 2.0 pattern below shows the idea (use in an XSLT 2.0 stylesheet and declare xmlns:xs="http://www.w3.org/2001/XMLSchema"):

<xsl:for-each-group select="tabelle/vorschaupaarungen/vorschaupaarung"
                    group-by="replace(normalize-space(spieldatum), '.*?([0-9]{2}\.[0-9]{2}\.[0-9]{4})$', '$1')">
  <xsl:sort select="xs:date(concat(substring(current-grouping-key(),7,4), '-', substring(current-grouping-key(),4,2), '-', substring(current-grouping-key(),1,2)))"/>
  <span class="C_termin"><xsl:value-of select="concat(substring(current-grouping-key(),1,5),'.')"/></span>
  <xsl:for-each select="current-group()">
    <span class="C_paarung"><xsl:value-of select="heimmannschaft"/> - <xsl:value-of select="gastmannschaft"/></span>
  </xsl:for-each>
</xsl:for-each-group>

Notes and caveats: if you cannot use XSLT 2.0, implement Muenchian grouping (key + generate-id) and normalize the date string with substring-after/substring before sorting. Also validate that all incoming spieldatum values follow a predictable pattern (leading weekday, two-digit day/month, four-digit year); if they vary (e.g., 27.1.2017 or missing year) normalize upstream or add extra parsing logic to avoid wrong sort order.

replace XSLT to:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>
    <xsl:template match="/">
        <doc xml:lang="de">
            <xsl:comment>Termine</xsl:comment>
            <p class="T_termine_fussball">
                <xsl:variable name="spieldatum" />
                <xsl:for-each select="tabelle/vorschaupaarungen/vorschaupaarung">
                    <xsl:if test="spieldatum != preceding-sibling::vorschaupaarung[1]/spieldatum">
                        <span class="C_termin">
                            <xsl:value-of select="normalize-space(substring(spieldatum,4,7))"/>
                        </span>
                    </xsl:if>
                    <span class="C_paarung">
                        <xsl:value-of select="heimmannschaft"/> - <xsl:value-of select="gastmannschaft"/>
                    </span>
                </xsl:for-each>    
            </p>
        </doc>
    </xsl:template>
</xsl:stylesheet>
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.