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 & 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 & 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 & 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 & BUTE|NORTH AYRSHIRE|SOUTH AYRSHIRE|DUMFRIES & GALLOWAY|WEST DUNBARTONSHIRE|EDINBURGH|FIFE|GLASGOW|HIGHLAND|INVERCLYDE|NORTH LANARKSHIRE|SOUTH LANARKSHIRE|EAST LOTHIAN|WEST LOTHIAN|MIDLOTHIAN|MORAY|PERTH & 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>
</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>
</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 & ISLES OF SCILLY</print_region_England>
</Story>
</Root>
주의 : 실제 XML은 사용자 정의 정렬하지만 짧은 버전을 필요로 지역의 더 유사 콘텐츠를 포함 위의 내 문제 강조
혹시 나무가 보이지 않는 예가 있었다면. 감사합니다. – GeoffChapman