2017-05-12 1 views
0

사용자 지정 순서를 사용하여 REGION 요소로 다음 구조로 시작하는 일부 XML을 정렬하려고합니다. B로 시작하는 지역이 올바른 순서 더비셔과 콘월에 나타나지 않는 반면 다음 코드를 사용하는 경우XSLT 사용자 지정 정렬 - 예상대로 정렬하지 않습니다.

<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> 

는하지만, 완전히 던져진다.

<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> 

나는 이러한 변화에서지고있어 결과는 정말 더비셔 이동할하지 나타나는 내가 바라던하지 않은 다음과 같습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

<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> 

주의 : 실제 XML은 사용자 정의 정렬하지만 짧은 버전을 필요로 지역의 더 유사 콘텐츠를 포함 위의 내 문제 강조

답변

1

귀하의 정렬 키를 명시 적으로도 기본이다 data-type="text"을 (이). 따라서 정렬 키의 문자열 값에 대해 사전 식 정렬을 수행하지만 숫자 정렬을 수행하는 것으로 보입니다. 숫자 정렬을 사용하려면 정렬 키가 data-type="number"으로 선언되어야합니다.

+0

혹시 나무가 보이지 않는 예가 있었다면. 감사합니다. – GeoffChapman

관련 문제