我想在基于Saxon的xslt转换中使用排序规则。源文件:
<root>
<entry name="B" />
<entry name="Aa" />
<entry name="Ä" />
<entry name="Az" />
</root>
和我的转变:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output indent="yes"/>
<saxon:collation name="german" lang="de-DE"/>
<xsl:template match="root">
<root>
<xsl:for-each select="entry">
<xsl:sort select="@name" collation="german"/>
<sorted entry="{@name}"/>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
这在氧气中几乎没有效果,输出是:
<root xmlns:saxon="http://saxon.sf.net/">
<sorted entry="Ä"/>
<sorted entry="Aa"/>
<sorted entry="Az"/>
<sorted entry="B"/>
</root>
(Ä应该是第二个条目,但这是另一个问题,我猜)
但是当我使用命令行时,出现错误:
java -jar saxon9he.jar -s:source.xml -o:out.xml -xsl:transformation.xsl
XTDE1035: Collation file:/Users/<mypath>/german has not been defined
Failed to compile stylesheet. 1 error detected.
看起来撒克逊人现在想要使用german
作为文件。它不存在。
问题是:如何在命令行中使用此样式表。
如果合适,我还会问如何将“Ä”排在两个“A”之间。条目,但我可以在另一个问题中问这个。
答案 0 :(得分:3)
最简单的解决方案是根本不使用collation属性,而是使用
<xsl:sort lang="de"/>
要求系统找到适合德语文本的排序规则,并且可以跨XSLT处理器移植。
如果您确实需要更精确的排序规则,可以在此处指导构建Saxon排序规则URI:http://www.saxonica.com/documentation/extensibility/collation.xml
错误的原因是,当您指定的值是相对URI引用时,它将被解释为相对于样式表的基URI。使用Saxon,这几乎不可避免地会产生一个不存在的归类URI。目前尚不清楚为什么规范允许相对整理URI;它们可能对某些产品有用,但它们对Saxon没有任何用处。