2012-05-16 3 views
0

첫 번째 문자로 요소를 그룹화하고 싶지만 다른 문자는 동일하게 간주해야합니다. A와 Ä (및 a와 ä)는 모두 같아야합니다.XSLT : 그룹화 키로 사용되는 문자 비교

출처 :

<root> 
    <entry name="Aa" /> 
    <entry name="Ab" /> 
    <entry name="Äa" /> 
    <entry name="Ac" /> 
    <entry name="Ba" /> 
</root> 

변환 :

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output indent="yes"/> 

    <xsl:template match="root"> 
    <root> 
     <xsl:for-each-group select="entry" group-by="upper-case(substring(@name,1,1))"> 
     <key><xsl:value-of select="current-grouping-key()"/></key> 
     </xsl:for-each-group> 
    </root> 
    </xsl:template> 

</xsl:stylesheet> 

지금 결과는 :

<root> 
    <key>A</key> 
    <key>Ä</key> 
    <key>B</key> 
</root> 

내가 원하는만큼 결과는 그것이 가지고 :

<root> 
    <key>A</key> 
    <key>B</key> 
</root> 
,536,

"Bb"를 제외한 모든 항목은 첫 번째 그룹에 있어야합니다.

성공적인 성공의 열쇠는 A, A 및 A를 동일하게 취급한다는 것입니다 (이는 일부 독일 정렬/정렬 규칙에 해당됨). 하지만 그것을 처리 할 수있는 xpath 함수를 찾지 못했습니다.

+0

하나의 해결책을 찾았지만 더 똑똑하고 깨끗한 해결책이 있습니까? ' – topskip

답변

1

어때 대략 translate(substring(@name,1,1), 'Ä', 'A')?

(a) XSL의 정렬 특성을 사용 : 피 각 그룹 오른쪽 비교 의미를 갖는 정렬 지정

+0

괜찮아 보이지만 더 많은 문자 클래스를 제공하지 않으면보다 간단한 해결책이 있어야합니다 (Ü-> U와 Ö-> > O 및 ß -> s) – topskip

+0

@ 패트 릭 : 번역 (substring (@ name, 1,1), 'ÄßÜÖ', 'ASUO') ' – xiaoyi

+0

과 같이 함께 넣어주세요. 당황 스럽네요. 당신 말이 맞아요. 고마워요! – topskip

2

두 가지 가능한 방법이있다. 불행히도 이것은 XSLT 프로세서에 의존 할 것입니다. 여기에 설명 된대로 색슨의 경우, 예를 들어, 당신은

http://saxon.sf.net/collation?lang=de;ignore-case=yes;ignore-modifiers=yes 

를 사용할 수 있습니다 :

http://www.saxonica.com/documentation/extensibility/collation.xml

(b)는 대안은 여기에 대한 답변의 대부분으로 "그것을 너 자신"로 추천되었다 즉, 그룹화를하기 전에 대소 문자를 정규화하고 액센트를 제거하는 일부 함수를 작성하십시오. 소문자() 나 대문자()를 호출하는 것은 대문자와 소문자를 구별하는 데는 완벽하지 않습니다. 대문자 (ß와 s) 그룹을 함께 사용하는 것이 주된 문제인 독일에서는 대문자()를 사용하는 것이 좋습니다. 액센트를 제거하는 것은 normalize-unicode()를 사용하여 유니 코드로 분해 된 정규형으로 정규화 한 다음 replace()를 사용하여 \ p {Lm} 범주의 문자를 제거 할 수 있습니다.

데이터 정렬을 사용하는 것이 좋습니다.