以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 其他W3C规范 』  (http://bbs.xml.org.cn/list.asp?boardid=25)
----  saxon6.5.3 对中文的排序问题(xsl:sort, saxon6.5.3, chinese character)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=25&rootid=&id=60072)


--  作者:lizlex
--  发布时间:3/17/2008 3:41:00 PM

--  saxon6.5.3 对中文的排序问题(xsl:sort, saxon6.5.3, chinese character)
使用saxon6.5.3,用<xsl:sort>对中文进行排序时,出现混乱,得不到想要的结果,大家是如何解决的?
源代码如下:
<-- country.xml -->
<?xml version="1.0" encoding="gb2312"?>
<root>
 <book>
  <title>中国(Zhong guo)(4)</title>
 </book>
 <book>
  <title>美国(Mei guo)(2)</title>
 </book>
 <book>
  <title>日本(Ri ben)(3)</title>
 </book>
 <book>
  <title>俄罗斯(e luo si)(1)</title>
 </book>
</root>

<--sort.xsl-->
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <xsl:template match="/">
  <root>
   <xsl:for-each select="root/book">
    <xsl:sort select="title"/>
    <p>
     <xsl:value-of select="title"/>
    </p>
   </xsl:for-each>
  </root>
 </xsl:template>
</xsl:stylesheet>
使用saxon6.5.3得到的错误结果如下:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <p>中国(Zhong guo)(4)</p>
 <p>俄罗斯(e luo si)(1)</p>
 <p>日本(Ri ben)(3)</p>
 <p>美国(Mei guo)(2)</p>
</root>

应该怎么办呢?


--  作者:jj_long
--  发布时间:5/17/2010 2:21:00 PM

--  
默认情况下,XSLT引擎设置的sort的数据类型是text,语言为英语。

这里的问题是需要按中文排序。

请参考:
1. http://saxon.sourceforge.net/saxon6.5/xsl-elements.html#xsl:sort
2. http://saxon.sourceforge.net/saxon6.5/extensibility.html#Implementing-a-collating-sequence

即:你需要在你的XSLT代码里指定语言,并且提供相应的Java扩展库:
1. XSLT
====================================
<?xml version='1.0'?>

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


<xsl:template match="/">
 <root>
  <xsl:for-each select="root/book">
   <xsl:sort select="title" lang="cn"/>
   <p>
   <xsl:value-of select="title"/>
   </p>
  </xsl:for-each>
 </root>
</xsl:template>
</xsl:stylesheet>

====================================

2. 扩展的Java代码:
====================================
package com.icl.saxon.sort;

import java.text.Collator;
import java.util.Comparator;

public class Compare_cn extends com.icl.saxon.sort.TextComparer {
 
 Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);

 @Override
 public int compare(Object arg0, Object arg1) {
  // TODO Auto-generated method stub
  
  return cmp.compare(arg0,arg1);
  
 }
 
 
}
====================================

3.输出结果:
====================================
<?xml version="1.0" encoding="utf-8"?>
<root>
   <p>俄罗斯(e luo si)(1)</p>
   <p>美国(Mei guo)(2)</p>
   <p>日本(Ri ben)(3)</p>
   <p>中国(Zhong guo)(4)</p>
</root>
====================================


把Java代码编译然后打包成jar文件,配置到你的classpath里边。



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms