根据旧闪米特语的字母对单词进行排序

Posted

技术标签:

【中文标题】根据旧闪米特语的字母对单词进行排序【英文标题】:Sorting words according to letters of an old Semitic language 【发布时间】:2018-07-02 22:19:08 【问题描述】:

我使用 XSLT 3.0,Saxon-PE 9.7。

我需要根据乌加里特语对orth 进行排序,接近希伯来语但有额外的字符。

我试过了:

 <xsl:sort select="orth" data-type="text" order="ascending" lang="uga"/>

但是建议的顺序不正确。所以我想我需要描述一下乌加里特字母顺序。我能怎么做?

提前,非常感谢。

【问题讨论】:

我认为 Saxon 9.7 文档中的 saxonica.com/html/documentation9.7/extensibility/config-extend/… 部分是相关的。 谢谢@Martin。我试着看CollationURIResolver。我想你说的是startsWith(saxonica.com/html/documentation9.7/javadoc/net/sf/saxon/lib/…。我对一封信(&lt;xsl:sort select="starts-with(orth, 'ʿ')" data-type="text" order="ascending"/&gt;)做了测试,但它不起作用。 我认为您不了解该配置的含义,您需要在实现 java.util.Comparator 的 Java 类或 Saxon 配置文件中声明您的排序规则。完成此操作后,您可以使用 xsl:sort 上的 collation 属性,例如collation="http://saxon.sf.net/collation?class=yourFullClassHere"select 属性将保持为 select="orth"。因此,该任务将在 XSLT 代码之外通过编写该字母表的排序规则来解决。 那么是哪些字符组成了该语言,那是en.wikipedia.org/wiki/Ugaritic_alphabet?这些字符不是按其 Unicode 代码点排序的吗? 谢谢@Martin。关于 Ugaritic,我使用的是转录,而不是楔形文字。关于撒克逊人的链接,对不起,如果我不明白,这对新手来说并不容易,尤其是当英语不是第一语言时。我确实看过oxygenxml.com/InstData/Editor/SDK/javadoc/ro/sync/… 和oxygenxml.com/doc/versions/19.1/ug-editor/…,但这对我来说真的太复杂了。我不知道java。在XSLT没有其他办法吗? 【参考方案1】:

我不确定这是否是最好的解决方案,但这是我所知道的。

您要搜索的代码是:

      <xsl:sort select="((orth='character1') * 1) + ((orth='character2') * 2) + ((orth='character3') * 3) ..." data-type="text" order="ascending"/>

您需要对字母表中的每个字符都执行此操作。乘法越低,它出现在结果中的时间就越早。基本上,您正在为指定值定义自己的顺序。

【讨论】:

谢谢@Christian。我试过了,但我收到以下消息“没有为类型参数定义算术运算符(xs:boolean,xs:integer)。”所以我尝试定义param: &lt;xsl:param name="orth.sort" select="orth" as="boolean"/&gt; 并替换&lt;xsl:sort select="orth..."&gt; by ` 但它也不起作用。 这不是正确的方法。我会自己回来回答这个问题,但正确的方法是在完成这项工作的 ICU 库中找到正确的排序规则,或者实施一个新的排序规则来完成这项工作。可能需要使用 xsl:sort 的 collat​​ion 参数而不是 lang 参数。 迈克尔可能是对的。正如我所写,我很确定有更好的解决方案。这对我自己的字母排序任务很有用。【参考方案2】:

Saxon 允许您在其配置文件中定义自己的排序规则,您基本上必须设置一个带有类似部分的配置文件

 <collations>
      <collation uri="http://example.com/uga-trans"
      rules="&lt; ʾa &lt; b &lt; g &lt; ḫ &lt; d &lt; h &lt; w &lt; z &lt; ḥ &lt; ṭ &lt; y &lt; k &lt; š &lt; l &lt; m &lt; ḏ &lt; n &lt; ẓ &lt; s &lt; ʿ &lt; p &lt; ṣ &lt; q &lt; r &lt; ṯ &lt; ġ &lt; t &lt; ʾi &lt; ʾu &lt; s2"/>
 </collations>

uri 属性将 URI 定义为排序规则的名称,然后您可以在 xsl:sortcollation 属性中使用该名称:

            <xsl:perform-sort select="$input-seq">
                <xsl:sort select="string()" collation="http://example.com/uga-trans"/>
            </xsl:perform-sort> 

rules 属性中使用的语法是为 Java 类 RuleBasedCollator https://docs.oracle.com/javase/7/docs/api/java/text/RuleBasedCollator.html 定义的语法,它有一个用于挪威语的示例。唯一需要注意的是,Java 语法是纯文本,而 Saxon 配置是 XML,因此用于定义排序的 &amp;lt; 必须在 rules 属性中转义为 &amp;lt;

我已经根据***文章https://en.wikipedia.org/wiki/Ugaritic_alphabet 中提供的转录序列在上面设置了一条规则。我不确定这是否是您要找的那个。

您可以使用-config:yourconfiguationfile.xml 从命令行运行 Saxon 以使用这样的配置,oXygen 在 Saxon 特定转换场景对话框中有一个字段来选择配置文件。

【讨论】:

非常感谢@Martin!对于新手(就像我一样)的一些额外信息:特别是对于那些使用 Oxygen 19.1 的人,配置文件称为“Saxon configuration.xml”。默认设置Edition=EE。由于我使用的是 Saxon PE,因此我更改为 Edition=PE。之后,在转换编辑器场景中,我添加了可以从“Transformer”窗口(在“Parameters”上方)添加的配置文件。然后在 xslt 文件中:&lt;xsl:apply-templates select="//entryFree"&gt; &lt;xsl:sort select="form/orth" collation="http://example.com/uga-trans"/&gt;&lt;/xsl:apply-templates&gt; 感谢马丁的回答。我只想补充几点意见,主要是针对以后来这里的其他人。 Saxon 实际上为您提供了两种选择 Ugaritic 排序规则的方法:在 xsl:sort 上,您可以指定 lang='uga' 或 `collat​​ion='w3.org/2013/collation/UCA?lang=uga'。目前,第一个选择 Ugaritic 的 JDK 语言环境,而第二个选择 ICU-J 版本。我不知道他们是否不同。但是,两者当然都不能处理音译输入。

以上是关于根据旧闪米特语的字母对单词进行排序的主要内容,如果未能解决你的问题,请参考以下文章

根据字符串属性按字母顺序对对象数组进行排序

根据 Woocommerce 中的运输姓氏按字母顺序对订单 ID 进行排序

如何根据最后一次观察而不是字母顺序对情节进行排序? [复制]

js 根据对象属性对数组进行按字母排序

根据子列表中的第二个元素按字母顺序对列表进行排序,但不区分大小写[重复]

使用排序规则对数组进行排序