Finde "immediate prededing sibling" i sorteret nodelist
Jeg har et problem, jeg ikke lige kan finde en løsning på. Problemet udarter sig, fra følgende xml:<STATES>
<STATE recno="25">
<ZIP>
<ZIPCODE>96951</ZIPCODE>
<AREACODE>670</AREACODE>
<COUNTY>ROTA</COUNTY>
</ZIP>
<ZIP>
<ZIPCODE>96950</ZIPCODE>
<COUNTY>SAIPAN</COUNTY>
</ZIP>
</STATE>
<STATE recno="26">
<ZIP>
<ZIPCODE>96970</ZIPCODE>
<COUNTY>EBEYE</COUNTY>
</ZIP>
<ZIP>
<ZIPCODE>96960</ZIPCODE>
<COUNTY>MAJURO</COUNTY>
</ZIP>
<ZIP>
<ZIPCODE>96970</ZIPCODE>
<COUNTY>EBEYE</COUNTY>
</ZIP>
<ZIP>
<ZIPCODE>96960</ZIPCODE>
<COUNTY>MAJURO</COUNTY>
</ZIP>
</STATE>
</STATES>
Jeg har behov for at finde unikke <COUNTY/> noder, og returnere disse. Jeg skal med andre ord, lave en transformation, hvor følgende xml bliver genereret:
<COUNTIES>
<COUNTY>ROTA</COUNTY>
<COUNTY>SAIPAN</COUNTY>
<COUNTY>EBEYE</COUNTY>
<COUNTY>MAJURO</COUNTY>
</COUNTIES>
Jeg har nu vadet rundt i det, og begynder at løbe tom for idéer ... jeg er bange for at det ikke lige kan lade sig gøre, med mindre man laver en rekursiv funktion - hvor man sorterer på .../ZIP/COUNTY for hver iteration, men denne løsning vil ikke være optimal, da xml'en er på ca 109000 linier :-|
den måde jeg ønsker at gøre det på, er at sortere hele xml'en på COUNTY ... fx:
<xsl:apply-templates select="STATES/STATE/ZIP/COUNTY">
<xsl:sort order="ascending"/>
</xsl:apply-templates>
hvor jeg nede i min template, gjorde noget ála:
<xsl:variable name="vPrecedingCountyName">
<xsl:value-of select="parent::*/preceding-sibling::*[1]/child::COUNTY"/>
</xsl:variable>
Det jeg så vil gøre, er at tjekke for om navnet, på dét COUNTY jeg står på, er forskellig fra den forrige i listen, men det er lige denne del jeg er usikker på om kan lade sig gøre, da man arbejder på en sorteret nodelist ... den xsl jeg har nu, ser sådan ud ...
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<xsl:element name="COUNTIES">
<xsl:apply-templates select="STATES/STATE/ZIP/COUNTY">
<xsl:sort order="ascending"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="COUNTY">
<xsl:variable name="pStateRecno">
<xsl:value-of select="parent::*/parent::*/@recno"/>
</xsl:variable>
<xsl:variable name="vPrecedingCountyName">
<xsl:value-of select="parent::*/preceding-sibling::*/child::COUNTY"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:element name="COUNTY">
<xsl:attribute name="state"><xsl:value-of select="$pStateRecno"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test=". = $vPrecedingCountyName"/>
<xsl:otherwise>
<xsl:element name="COUNTY">
<xsl:attribute name="state"><xsl:value-of select="$pStateRecno"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Meeeen ... det fungerer ikke ... any ideas anyone ?
/nute