続:DITAのindextermをソートする

先だって話題にした以下のコードを組み込むとindextermのソーティングが外部ライブラリなしにできるようになります.
 
[xsl] Sorting with unknown number of sort keys (Was: Re: Sort question)
http://www.biglist.com/lists/xsl-list/archives/200303/msg00007.html
 
でも、実際にいろいろデータを試してみると、会社が売っているライブラリとビミョーに索引の出力結果が違います.何が違うかというと、「索引の文字列に空白が含まれているときの並び順」が違うのです.ここまでくるとDITAとは関係ない話になりますが.
 
まず上記の核となる文字列の比較は、以下のようなXSLT2.0のコードに変更しています.
 
<xsl:template name="node-strComp" as="xs:integer">
    <xsl:param name="n1" as="xs:string?" required="yes"/>
    <xsl:param name="n2" as="xs:string?" required="yes"/>
    <xsl:sequence select="compare($n1,$n2,'http://saxon.sf.net/collation?lang=en;';)"/>
</xsl:template>
 
XSLTXPath)のcompareはたぶん間違いなくJavaのCollatorクラスを使うでしょう.そこで次のようなJavaのプログラムを作って試してみました.
 
public class CompareTest {
  public static void main(String args) {
    Collator enCollator = Collator.getInstance(Locale.US);
    String
srcStringArray={"A",
                             "a",
                             " ",
                             "XSL Transformation",
                             "xsl Transformation",
                             "XSLT",
                             "xslt"
                            };
    printArray(srcStringArray,"Source=");
    Arrays.sort(srcStringArray,enCollator);
    printArray(srcStringArray,"Result=");
    System.exit(0);
  }
  private static void printArray(String[] array, String desc){
      StringBuffer buf = new StringBuffer();
      String str;
      System.out.print(desc);
      for (int i = 0; i < array.length; i++) {
        if (i > 0){
          buf.append(",");
        }
        str="\""+array[i]+"\"";
        buf.append(str);
      }
      System.out.println(buf.substring(0, buf.length()));
  }
}
 
すると次のような結果でした.つまりJavaのCollatorは先頭の空白は評価するが途中の空白は無視するのです.
 
Source="A","a"," ","XSL Transformation","xsl Transformation","XSLT","xslt"
Result=" ","a","A","xslt","XSLT","xsl Transformation","XSL Transformation"
 
会社のライブラリはICU(http://www-01.ibm.com/software/globalization/icu/)を使っています.そこで
com.ibm.icu.text.Collator enCollator = com.ibm.icu.text.Collator.getInstance(Locale.US);
 
とICUのCollatorを使うように変えると
 
Source="A","a"," ","XSL Transformation","xsl Transformation","XSLT","xslt"
Result=" ","a","A","xsl Transformation","XSL Transformation","xslt","XSLT"
 
となります.つまりICUのCollatorは空白を尊重するのです.
ここまでくると英語のカルチャーの問題になってしまいます.Michael Kayは
 
 
で、「but ignoring spaces is quite common, and certainly not incorrect: if I look up "ad hoc" in a dictionary, I expect to find it between "adhesive" and "adieu".」と言っています.
 
プログラムを作る方からすると困った問題なのですが、やはり世の中いろいろあるものですね.