使用符号、字母和数字进行XSLT自定义排序(O计数为零)



我有一个包含一系列零件号行的表。我需要按照一系列非常具体的序列对输出进行排序,但我不知道如何进行

<xsl:apply-templates select="row">
<xsl:sort select="row/partNumber"/>
</xsl:apply-templates>

正确。我需要它们按排序

  1. 符号(特别是斜线、句点和短划线(
  2. 字母(字母O除外(
  3. 数字(字母O为0(

有人有什么想法吗?

编辑后添加:我使用的是XSLT2.0和saxon。一些样本数据是

<row>
<partNumber>AN931-4-13</partNumber>
</row>
<row>
<partNumber>AN931.2</partNumber>
</row>
<row>
<partNumber>AO931</partNumber>
</row>
<row>
<partNumber>AP417-3</partNumber>
</row>
<row>
<partNumber>AP417/3</partNumber>
</row>

应输出为:

AN931.2
AN931-4-13
AP417/3
AP417-3
AO931

已编辑以添加:这是我采用的解决方案。我通过将规则设置为变量

<xsl:variable name="rules">
<xsl:text>&lt; '/' &lt; '.' &lt; '-' &lt; a,A &lt; b,B &lt; c,C &lt; d,D &lt; e,E &lt; f,F &lt; g,G &lt; h,H &lt; i,I &lt; j,J &lt; k,K &lt; l,L &lt; m,M &lt; n,N  &lt; p,P &lt; q,Q &lt; r,R &lt; s,S &lt; t,T &lt; u,U &lt; v,V &lt; w,W &lt; x,X &lt; y,Y &lt; z,Z &lt; 0 = o = O &lt; 1 &lt; 2 &lt; 3 &lt; 4 &lt; 5 &lt; 6 &lt; 7 &lt; 8 &lt; 9</xsl:text>
</xsl:variable>

然后我就用

<xsl:sort select="partNumber" collation="http://saxon.sf.net/collation?rules={encode-for-uri($rules)}"/>

我试图为您的语法构建一些排序规则,并将其提供给Saxon配置,在以下使用XQuery3.1和transform函数以及所有内联配置数据完成的示例中:

transform(map {
'source-node' : .,
'stylesheet-node' : <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="rows">
<xsl:copy>
<xsl:apply-templates select="row">
<xsl:sort select="partNumber" collation="http://example.com/mc1"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="/" name="xsl:initial-template">
<xsl:next-match/>
</xsl:template>
</xsl:stylesheet>,
'vendor-options' : map {
QName('http://saxon.sf.net/', 'configuration'): 
<configuration xmlns="http://saxon.sf.net/ns/configuration">
<collations>
<collation uri="http://example.com/mc1"
alphanumeric="yes"
rules="&lt; a,A &lt; b,B &lt; c,C &lt; d,D &lt; e,E &lt; f,F &lt; g,G &lt; h,H &lt; i,I &lt; j,J &lt; k,K &lt; l,L &lt; m,M &lt; n,N  &lt; p,P &lt; q,Q &lt; r,R &lt; s,S &lt; t,T &lt; u,U &lt; v,V &lt; w,W &lt; x,X &lt; y,Y &lt; z,Z &lt; 0 = o = O &lt; 1 &lt; 2 &lt; 3 &lt; 4 &lt; 5 &lt; 6 &lt; 7 &lt; 8 &lt; 9 &lt; '/' &lt; '.' &lt; '-'"/>           
</collations>
</configuration>
}
}
)?output

对于输入

<rows>
<row>
<partNumber>AN931-4-13</partNumber>
</row>
<row>
<partNumber>AN931.2</partNumber>
</row>
<row>
<partNumber>AO931</partNumber>
</row>
<row>
<partNumber>AP417-3</partNumber>
</row>
<row>
<partNumber>AP417/3</partNumber>
</row>
</rows>

我得到输出

<rows>
<row>
<partNumber>AN931.2</partNumber>
</row>
<row>
<partNumber>AN931-4-13</partNumber>
</row>
<row>
<partNumber>AP417/3</partNumber>
</row>
<row>
<partNumber>AP417-3</partNumber>
</row>
<row>
<partNumber>AO931</partNumber>
</row>
</rows>

使用Saxon 11.2 HE,现在也在线测试了10.6 HEhttps://xqueryfiddle.liberty-development.net/94hwpia.

我希望,无论您使用什么Saxon 9版本,都可以为它提供一个适当的配置文件,该文件具有类似于或基于上面示例中的排序规则的适当排序规则。或者,正如你的评论所指出的,你也可以内联规则:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">

<xsl:param name="rules" as="xs:string">&lt; a,A &lt; b,B &lt; c,C &lt; d,D &lt; e,E &lt; f,F &lt; g,G &lt; h,H &lt; i,I &lt; j,J &lt; k,K &lt; l,L &lt; m,M &lt; n,N  &lt; p,P &lt; q,Q &lt; r,R &lt; s,S &lt; t,T &lt; u,U &lt; v,V &lt; w,W &lt; x,X &lt; y,Y &lt; z,Z &lt; 0 = o = O &lt; 1 &lt; 2 &lt; 3 &lt; 4 &lt; 5 &lt; 6 &lt; 7 &lt; 8 &lt; 9 &lt; '/' &lt; '.' &lt; '-'</xsl:param>
<xsl:output method="xml" indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="rows">
<xsl:copy>
<xsl:apply-templates select="row">
<xsl:sort select="partNumber" collation="http://saxon.sf.net/collation?rules={encode-for-uri($rules)}"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

最新更新