xslt - XSL/Saxon 排序规则/命令行

标签 xslt xslt-2.0 collation saxon

我想在基于 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>

这在 Oxygen 中几乎可以正常工作,输出是:

<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.

看起来 saxon 现在想要使用 german 作为文件。它不存在。


问题是:如何在命令行上使用此样式表。

如果合适的话,我还会问如何在两个“A”之间排序“Ä”。条目,但我可以在另一个问题中提出这个问题。

最佳答案

最简单的解决方案是根本不使用 collat​​ion 属性,而是使用

<xsl:sort lang="de"/>

它要求系统找到适合德语文本的排序规则,并且可以跨 XSLT 处理器移植。

如果您确实想要更精确的排序规则,这里有关于构建 Saxon 排序规则 URI 的指南:http://www.saxonica.com/documentation/extensibility/collation.xml

错误的原因是,当您指定的值是相对 URI 引用时,它会被解释为相对于样式表的基本 URI。对于 Saxon,这几乎不可避免地会产生一个不存在的排序规则 URI。目前尚不清楚为什么规范允许相对排序 URI;它们可能对某些产品有用,但对 Saxon 没有任何用处。

关于xslt - XSL/Saxon 排序规则/命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10618537/

相关文章:

java - xslt xsl :result-document overwrites file

javascript - 如何在 xslt 2.0 中显示年份列表?

xslt - 向上一个节点,查看父节点是否等同于 XSLT 中的特定节点

mysql - 数据库排序规则区别UTF?拉丁? ETC。?

xml - XSL,使用 XML 作为模板的参数

c# - 通过 XSLT 在 XML 中格式化日期

xslt - 使用 XSL 根据 if 条件设置变量值

xslt - xslt中多次出现相同的路径

mysql - MySQL 中非法混合排序规则 =

php - 在 MySQL 中存储任意字符编码的任意字符串并检索它们