根据旧闪米特语的字母对单词进行排序
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/…。我对一封信(<xsl:sort select="starts-with(orth, 'ʿ')" data-type="text" order="ascending"/>
)做了测试,但它不起作用。
我认为您不了解该配置的含义,您需要在实现 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
: <xsl:param name="orth.sort" select="orth" as="boolean"/>
并替换<xsl:sort select="
orth..."> by
Saxon 允许您在其配置文件中定义自己的排序规则,您基本上必须设置一个带有类似部分的配置文件
<collations>
<collation uri="http://example.com/uga-trans"
rules="< ʾa < b < g < ḫ < d < h < w < z < ḥ < ṭ < y < k < š < l < m < ḏ < n < ẓ < s < ʿ < p < ṣ < q < r < ṯ < ġ < t < ʾi < ʾu < s2"/>
</collations>
uri
属性将 URI 定义为排序规则的名称,然后您可以在 xsl:sort
的 collation
属性中使用该名称:
<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,因此用于定义排序的 &lt;
必须在 rules
属性中转义为 &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 文件中:<xsl:apply-templates select="//entryFree"> <xsl:sort select="form/orth" collation="http://example.com/uga-trans"/></xsl:apply-templates>
感谢马丁的回答。我只想补充几点意见,主要是针对以后来这里的其他人。 Saxon 实际上为您提供了两种选择 Ugaritic 排序规则的方法:在 xsl:sort
上,您可以指定 lang='uga'
或 `collation='w3.org/2013/collation/UCA?lang=uga'。目前,第一个选择 Ugaritic 的 JDK 语言环境,而第二个选择 ICU-J 版本。我不知道他们是否不同。但是,两者当然都不能处理音译输入。以上是关于根据旧闪米特语的字母对单词进行排序的主要内容,如果未能解决你的问题,请参考以下文章
根据 Woocommerce 中的运输姓氏按字母顺序对订单 ID 进行排序
如何根据最后一次观察而不是字母顺序对情节进行排序? [复制]