从排序列表xslt 1.0中的数字中分割出来的字母

时间:2013-12-13 12:51:36

标签: xml xslt xslt-1.0

这是XML代码,您可以看到此项目组按字母和数字排序:

<LIGHT_RANGE_LIST>
  <RANGE>W19</RANGE>
  <RANGE>W17</RANGE>
  <RANGE>R15</RANGE>
  <RANGE>R13</RANGE>
  <RANGE>R11</RANGE>
</LIGHT_RANGE_LIST>

这是我的XSLT代码:

<xsl:for-each select="RANGE">
    <span style="text-align:center;font-family:Univers Condensed; font-size:9pt; ">
        <xsl:apply-templates/>
    </span>
</xsl:for-each>

我已临时应用此模板,获得此结果:

W19
W17
R15
R13
R11

我的最终目标是获得以下输出:

W19
R15

对于每个字母,请带上具有最大数值的字母 - 假设可以有一个字母(不是两个)

2 个答案:

答案 0 :(得分:1)

尝试类似:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="by_letter" match="RANGE" use="substring(., 1, 1)" />

<xsl:template match="/">
<div>
    <!-- for each distinct letter -->
    <xsl:for-each select="LIGHT_RANGE_LIST/RANGE[generate-id() = generate-id(key('by_letter', substring(., 1, 1))[1])]">
        <!-- process the subgroup -->
        <xsl:for-each select="key('by_letter', substring(., 1, 1))">
            <xsl:sort select="substring(., 2)" data-type="number" order="descending"/>
            <xsl:if test="position()=1">
                <span><xsl:value-of select="."/></span>
            </xsl:if>
        </xsl:for-each>
    </xsl:for-each>
</div>
</xsl:template>
</xsl:stylesheet>

查看解释here

答案 1 :(得分:0)

最后,我研究你的版本并且我应用了这个,这是类似的,但由我创建。谢谢你的合作。

变量名称:
Lcorrente-&gt;当前信件
LSuccessiva-&gt;下一个字母
Ncorrente->当前编号
Nsuccessiva-&gt;下一个号码

<xsl:for-each select="RANGE">

<!-- Prendo le lettere-->
<xsl:variable name="LCorrente" select="substring(.,1,1)"/>                                                                                                                          
<xsl:variable name="LSuccessiva" select="substring(preceding-sibling::RANGE[1]  [preceding::IMMUTABLE_ID=$EF],1,1)"/>

<!-- Prendo i numeri-->
<xsl:variable name="NCorrente" select="number(substring(.,2,string-length(.)-1))"/>
<xsl:variable name="NSuccessiva" select="number(substring(following-sibling::RANGE[1][preceding::IMMUTABLE_ID=$EF],2,string-length(following-sibling::RANGE[1][preceding::IMMUTABLE_ID=$EF])-1))"/>

<xsl:when test="$LCorrente!=$LSuccessiva">
    <span style="font-family:Univers Condensed; font-size:9pt; color:orange; text-align:center;">
        <xsl:value-of select="$LCorrente"/>                                                                         
    </span>     

    <span style="font-family:Univers Condensed; font-size:9pt; color:red; text-align:center; ">
        <xsl:value-of select="$NCorrente"/>
    </span>
</xsl:when>
</xsl:for-each>