2009-11-08 2 views
0

각 뉴스 루프 노드마다 루프가 있습니다. 다른 속성들 중에서도 이러한 뉴스 항목에는 만든 날짜에 대한 두 가지 특성이 있습니다. 시스템이 날짜를 추가하고 사용자가 만든 날짜를 입력하여 시스템 날짜를 무시합니다. 목록을 사용자가 입력 한 날짜의 기본 설정으로 생성 날짜별로 정렬하고 싶습니다.XSLT 첫 번째 항목이 비어 있으면 두 번째 값으로 정렬 적용

다음은 저의 겸허 한 잘못된 시도입니다!

<xsl:for-each select="$currentPage/ancestor-or-self::node /node [@nodeTypeAlias = $documentTypeAlias and string(data [@alias='umbracoNaviHide']) != '1']"> 

<xsl:choose> 
<xsl:when test="data [@alias = 'createdDate'] != ''"> 
    <xsl:variable name="sort" select="string(data [@alias = 'createdDate'])"/> 
</xsl:when> 
<xsl:otherwise> 
    <xsl:variable name="sort" select="string(@createDate)"/> 
</xsl:otherwise> 
</xsl:choose> 

<xsl:sort select="$sort" order="descending"/> 

많은 감사

+0

umbraco ftw. 나는 xslt에서 조건부 정렬을하는 많은 드라마를 가졌습니다. – ChadT

답변

7
<xsl:sort select="(data[@alias='createdDate' and normalize-space() != '']|@createDate)[last()]" order="descending" /> 

이 문장은 날짜를 포함하는 두 개의 노드와 노드 집합을 생성하고, 정렬을 수행하기 위해 문서 순서에 따라 마지막 것을 얻으십시오. 데이터 노드가 있고 비어 있지 않은 경우 요소의 하위 요소가 해당 특성 노드 다음에 발생하기 때문에 정렬에 사용됩니다.

concat()는 텍스트 정렬을 사용하는 경우에만 작동하며, 경우에 따라 텍스트 정렬을 사용할 수 있습니다. 그것은 숫자 정렬과 함께 실패합니다.

+0

나는 이것이 효과가 있다고 생각했지만, 더 자세히 살펴보면 상당히 그렇지 않다. createdDate의 별명을 가진 데이터 노드가 있으면 그것을 사용하지만 존재하지 않으면 대신 @createDate가 사용되지 않습니다. 이것에 대한 아이디어가 있습니까? concat을 사용하면 더 견고 해 보입니다. 그래서 저는 인내하고 싶습니다. – Max

+0

비트 더 많은 정보. 데이터 노드는 존재하지만 비어 있다고 생각합니다. 이 경우 @createDate를 사용하고 싶습니다. – Max

+0

OK, 방금 모든 것을 노출하지 않았습니다. ;) 빈 데이터 노드가 정렬을 위해 선출되어서는 안되는 경우 술어를 수정해야합니다. 나는 내 대답을 편집했다. – Erlock

0

오른쪽, 해킹 것 같아하지만 난 종류와 CONCAT를 사용하여이를 달성 할 수 있었다.

<xsl:for-each select="$currentPage/ancestor-or-self::node /node [@nodeTypeAlias = $documentTypeAlias and string(data [@alias='umbracoNaviHide']) != '1']"> 
<xsl:sort select="concat(data [@alias = 'createdDate'],@createDate)" order="descending"/> 
0

는 XSLT의 노드가 비어있는 경우 테스트 (또는 생략) 아래는 :

<xsl:when test="not(string(name))">...</xsl:when> 
<!-- or --> 
<xsl:when test="not(name)">...</xsl:when> 
0

Erlock에게 많은 감사의 말씀을 전합니다. Umbraco XSLT 구문의 변경으로 인해 Umbraco (4.7.1) 버전에서이 작업을 수행하기 위해 얼마 동안 노력했습니다.

관심있는 사람들에게 제 작업 표본은 Erlock의 코드를 변경합니다.

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" /> 
관련 문제