2017-05-12 4 views
0

Ich versuche eine benutzerdefinierte Reihenfolge zu verwenden, um einige XML-Dateien zu sortieren, die in der folgenden Struktur durch das Element REGION beginnen.XSLT Benutzerdefinierte Sortierung - nicht wie erwartet sortiert

<EXPORT> 
    <ESTABLISHMENTS> 
     <ESTABLISHMENT> 
      <NAME>One</NAME> 
      <LOCATION> 
       <REGION>BERKSHIRE</REGION> 
       <COUNTRY>England</COUNTRY> 
      </LOCATION> 
     </ESTABLISHMENT> 
     <ESTABLISHMENT> 
      <NAME>Two</NAME> 
      <LOCATION> 
       <REGION>DERBYSHIRE</REGION> 
       <COUNTRY>England</COUNTRY> 
      </LOCATION> 
     </ESTABLISHMENT> 
     <ESTABLISHMENT> 
      <NAME>Three</NAME> 
      <LOCATION> 
       <REGION>BRISTOL</REGION> 
       <COUNTRY>England</COUNTRY> 
      </LOCATION> 
     </ESTABLISHMENT> 
     <ESTABLISHMENT> 
      <NAME>Four</NAME> 
      <LOCATION> 
       <REGION>CORNWALL &amp; ISLES OF SCILLY</REGION> 
       <COUNTRY>England</COUNTRY> 
      </LOCATION> 
     </ESTABLISHMENT> 
     <ESTABLISHMENT> 
      <NAME>Five</NAME> 
      <LOCATION> 
       <REGION>BEDFORDSHIRE</REGION> 
       <COUNTRY>England</COUNTRY> 
      </LOCATION> 
     </ESTABLISHMENT> 
    </ESTABLISHMENTS> 
</EXPORT> 

Wenn jedoch mit dem folgenden Code, während die Regionen, die mit B beginnen in der richtigen Reihenfolge Derbyshire und Cornwall erscheinen vollständig geworfen.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" omit-xml-declaration="no"/> 
    <!-- Declare variables for text case conversion --> 
    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'"/> 
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
    <xsl:variable name="space" select="' '"/> 
    <xsl:variable name="underscore" select="'_'"/> 

    <!-- Genertate key for sorting by region --> 
    <xsl:key name="establishment-by-region" match="ESTABLISHMENTS/ESTABLISHMENT/LOCATION" use="REGION"/> 
    <!-- Generate key for sorting by Locality --> 
    <xsl:key name="establishment-by-locality" match="ESTABLISHMENTS/ESTABLISHMENT/LOCATION" use="LOCALITY"/> 

    <!-- England Counties sort order --> 
    <xsl:variable name="englandSortOrder">|BEDFORDSHIRE|BERKSHIRE|BRISTOL|BUCKINGHAMSHIRE|CAMBRIDGESHIRE|CHESHIRE|CORNWALL &amp; ISLES OF SCILLY|CUMBRIA|DERBYSHIRE|DEVON|DORSET|COUNTY DURHAM|ESSEX|GLOUCESTERSHIRE|GREATER MANCHESTER|HAMPSHIRE|HEREFORDSHIRE|HERTFORDSHIRE|ISLE OF WIGHT|KENT|LANCASHIRE|LEICESTERSHIRE|LINCOLNSHIRE|LONDON POSTAL DISTRICTS|GREATER LONDON|MERSEYSIDE|NORFOLK|NORTHAMPTONSHIRE|NORTHUMBERLAND|NOTTINGHAMSHIRE|OXFORDSHIRE|RUTLAND|SHROPSHIRE|SOMERSET|STAFFORDSHIRE|SUFFOLK|SURREY|EAST SUSSEX |WEST SUSSEX|TYNE &amp; WEAR|WARWICKSHIRE|WEST MIDLANDS|WILTSHIRE|WORCESTERSHIRE|EAST RIDING OF YORKSHIRE|NORTH YORKSHIRE|SOUTH YORKSHIRE|WEST YORKSHIRE|GUERNSEY|HERM|JERSEY|SARK|ISLE OF MAN|ABERDEEN|ABERDEENSHIRE|ANGUS|ARGYLL &amp; BUTE|NORTH AYRSHIRE|SOUTH AYRSHIRE|DUMFRIES &amp; GALLOWAY|WEST DUNBARTONSHIRE|EDINBURGH|FIFE|GLASGOW|HIGHLAND|INVERCLYDE|NORTH LANARKSHIRE|SOUTH LANARKSHIRE|EAST LOTHIAN|WEST LOTHIAN|MIDLOTHIAN|MORAY|PERTH &amp; KINROSS|SCOTTISH BORDERS|STIRLING|WESTERN ISLES|ISLE OF ANGLESEY|BLAENAU GWENT|BRIDGEND|CAERPHILLY|CARDIFF|CARMARTHENSHIRE|CEREDIGION|CONWY|DENBIGHSHIRE|FLINTSHIRE|GWYNEDD|MERTHYR TYDFIL|MONMOUTHSHIRE|NEATH PORT TALBOT|PEMBROKESHIRE|POWYS|SWANSEA|TORFAEN|VALE OF GLAMORGAN|WREXHAM|COUNTY ANTRIM|COUNTY ARMAGH|BELFAST|COUNTY DOWN|COUNTY FERMANAGH|COUNTY LONDONDERRY|COUNTY CARLOW|COUNTY CAVAN|COUNTY CLARE|COUNTY CORK|COUNTY DONEGAL|DUBLIN|COUNTY GALWAY|COUNTY KERRY|COUNTY KILDARE|COUNTY KILKENNY|COUNTY LAOIS|COUNTY LIMERICK|COUNTY LOUTH|COUNTY MAYO|COUNTY MEATH|COUNTY MONAGHAN|COUNTY ROSCOMMON|COUNTY SLIGO|COUNTY TIPPERARY|COUNTY TYRONE|COUNTY WATERFORD|COUNTY WEXFORD|COUNTY WICKLOW|</xsl:variable> 

    <!-- Base template for matching SEER root element --> 
    <xsl:template match="EXPORT"> 
     <xsl:element name="Root"> 
      <xsl:element name="Story"> 
       <!-- Loop through all the Regions (Counties) and sort basedon bespke order --> 
       <xsl:for-each select="ESTABLISHMENTS/ESTABLISHMENT/LOCATION[count(.| key('establishment-by-region', REGION)[1]) = 1]"> 
        <xsl:sort select="string-length(substring-before($englandSortOrder, concat('|', REGION,'|')))" data-type="text"/> 

        <!-- COUNTRY SELECTOR START--> 
        <xsl:if test="COUNTRY = 'England'"> 
        <!-- COUNTRY SELECTOR END --> 

        <xsl:element name="print_region_{COUNTRY}"> 
         <xsl:value-of select="REGION"/> 
        </xsl:element> 
        <xsl:text>&#x0A;</xsl:text> 
        <xsl:for-each select="key('establishment-by-region', REGION)"> 
         <xsl:sort select="LOCALITY"/> 
         <xsl:apply-templates select='ancestor::ESTABLISHMENT' mode='localities'/> 
        </xsl:for-each> 
        </xsl:if> 
       </xsl:for-each> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <!-- Sort a given region by Locality (Town) --> 
    <xsl:template match="node()" mode="localities"> 
     <xsl:for-each select="LOCATION[count(.| key('establishment-by-locality', LOCALITY)[1]) = 1]"> 

       <xsl:element name="print_location_{COUNTRY}"> 
        <xsl:value-of select="LOCALITY"/> 
       </xsl:element> 
       <xsl:text>&#x0A;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Die Ergebnisse, die ich aus dieser Transformation erhalten sind wie folgt, die nicht wirklich das, was ich hatte gehofft, für so Derbyshire bewegen, um nicht zu wollen, erscheint. Jede Hilfe wäre sehr willkommen.

<Root> 
<Story> 
    <print_region_England>BEDFORDSHIRE</print_region_England> 

    <print_region_England>DERBYSHIRE</print_region_England> 

    <print_region_England>BERKSHIRE</print_region_England> 

    <print_region_England>BRISTOL</print_region_England> 

    <print_region_England>CORNWALL &amp; ISLES OF SCILLY</print_region_England> 

</Story> 
</Root> 

NB: Die tatsächliche XML Weitere Varianten REGION enthält, die die benutzerdefinierte Sortierung, aber die kurze Version erforderlich machen oben hebt mein Problem

Antwort

1

Ihre Sortierschlüssel hat explizit data-type="text" (was auch die Standardeinstellung). Sie führen daher eine lexikographische Sortierung der Zeichenfolgenwerte Ihrer Sortierschlüssel durch, aber Sie scheinen eine numerische Sortierung durchzuführen. Eine numerische Sortierung würde erfordern, dass der Sortierschlüssel mit data-type="number" deklariert wird.

+0

Wenn es jemals ein Beispiel gab, das Holz für die Bäume nicht sehen zu können. Vielen Dank. – GeoffChapman

Verwandte Themen