我有一個包含一系列零件編號行的表格。我需要按一系列非常具體的順序對輸出進行排序,但不知道該怎么做
<xsl:apply-templates select="row">
<xsl:sort select="row/partNumber"/>
</xsl:apply-templates>
適當地。我需要它們按以下方式排序:
- 符號(特別是斜線,然后是句點,然后是破折號)
- 字母(字母 O 除外)
- 數字(字母 O 計為 0)
有人有什么想法嗎?
編輯添加:我正在使用 XSLT 2.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)}"/>
uj5u.com熱心網友回復:
我嘗試為您的語法構建一些排序規則并將其提供給 Saxon 配置,在以下示例中使用 XQuery 3.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,現在也在https://xqueryfiddle.liberty-development.net/94hwpia使用 10.6 HE 在線測驗。
I hope, whatever Saxon 9 version you use, that you can just feed it an appropriate configuration file with an appropriate collation similar to or based on the one in the above sample. Or, as your comment points out, you can also inline the rules:
<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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452408.html
下一篇:xsltprocXML決議器多值
