先だって話題にした以下のコードを組み込むとindextermのソーティングが外部ライブラリなしにできるようになります.
[xsl] Sorting with unknown number of sort keys (Was: Re: Sort question)
http://www.biglist.com/lists/xsl-list/archives/200303/msg00007.html
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>
<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>
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()));
}
}
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"
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"
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".」と言っています.
プログラムを作る方からすると困った問題なのですが、やはり世の中いろいろあるものですね.