2014-10-27 2 views
0

Я пытаюсь сортировать узел XML-узлов одним из двух полей, обусловленным значением в другом поле.Сортировка по одному из двух полей

<xsl:for-each select="CampusCourseDeliveryItem"> 
    <xsl:sort select="OffCampus"/> 
    <xsl:sort select="OrganisationName" /> 
    <xsl:sort select="OffCampusLocation"/> 

<!-- code to display node goes here --> 

То, что я хочу, если OffCampus='Y', используйте OffCampusLocation в качестве ключа сортировки, в противном случае используйте OrganisationName.

Пример данных:

<CampusCourseDelivery> 
    <CampusCourseDeliveryItem> 
     <OrganisationName>Chicago</OrganisationName> 
     <OffCampus>N</OffCampus> 
     <OffCampusLocation></OffCampusLocation> 
    </CampusCourseDeliveryItem> 
    <CampusCourseDeliveryItem> 
     <OrganisationName>London</OrganisationName> 
     <OffCampus>Y</OffCampus> 
     <OffCampusLocation>Detroit</OffCampusLocation> 
    </CampusCourseDeliveryItem> 
    <CampusCourseDeliveryItem> 
     <OrganisationName>Seattle</OrganisationName> 
     <OffCampus>Y</OffCampus> 
     <OffCampusLocation>Berlin</OffCampusLocation> 
    </CampusCourseDeliveryItem> 
    <CampusCourseDeliveryItem> 
     <OrganisationName>Adelaide</OrganisationName> 
     <OffCampus>N</OffCampus> 
     <OffCampusLocation>Ignore this value</OffCampusLocation> 
    </CampusCourseDeliveryItem> 
</CampusCourseDelivery> 

Ожидаемый порядок сортировки:

Adelaide 
Berlin 
Chicago 
Detroit 

ответ

3

Сортировать по следующему выражению:

concat(
substring(OffCampusLocation, 1, string-length(OffCampusLocation) * (OffCampus='Y')), 
substring(OrganisationName, 1, string-length(OrganisationName) * (OffCampus='N'))  
) 
+0

Это * почти * работал ... Я должен был изменить ' OffCampus = 'N'' для 'normalize-space (OffCampus)! =' Y'' для обработки случаев, когда OffCampus имеет значение NULL. (Который я не привел пример из моих данных примера, настолько справедливо, что вы не удовлетворяли его.) – Adeptus