我有一个包含一系列零件号行的表。我需要按照一系列非常具体的序列对输出进行排序,但我不知道如何进行
<xsl:apply-templates select="row">
<xsl:sort select="row/partNumber"/>
</xsl:apply-templates>
正确。我需要它们按排序
- 符号(特别是斜线、句点和短划线(
- 字母(字母O除外(
- 数字(字母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>< '/' < '.' < '-' < a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z < 0 = o = O < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 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="< a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z < 0 = o = O < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < '/' < '.' < '-'"/>
</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">< a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z < 0 = o = O < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < '/' < '.' < '-'</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>