Xslt排序数字

3

我正在尝试对一些数字进行排序,但是在排序方面遇到了一些问题。

  1. rep_Tool / @ ToolStnNo 是一个节点,可以按任意顺序给出工具的编号。

例如:

    ...
    <ToolStnNo>
    10
    </ToolStnNo>
    ...
    <ToolStnNo>
    12
    </ToolStnNo>
    ...
    <ToolStnNo>
    3
    </ToolStnNo>
    ...
    <ToolStnNo>
    11
    </ToolStnNo>
    ...
    <ToolStnNo>
    2
    </ToolStnNo>
    ...
    <ToolStnNo>
    4
    </ToolStnNo>
    ...
    <ToolStnNo>
    1
    </ToolStnNo>
    ...
    <ToolStnNo>
    6
    </ToolStnNo>
    ...
    <ToolStnNo>
    5
    </ToolStnNo>
    ...
    <ToolStnNo>
    8
    </ToolStnNo>
    ...
    <ToolStnNo>
    7
    </ToolStnNo>
    ...

我得到的结果表格是:
10   --- > This 10 dont be here
1
2
3
4
5
6
7
8
11
12
13

而正确的方式是:

1
2
3
4
5
6
7
8
10   --- > This 10 should be here
11
12
13

    <xsl:for-each select="MillSetupSheetAttr">
        <xsl:for-each select="MillOperation"> 
            <xsl:sort select="rep_Tool/@ToolStnNo" data-type="number"/>
            <tr>
                <td><font><xsl:value-of select="rep_Tool/@ToolStnNo"/></font></td>
            </tr>
        </xsl:for-each>
    </xsl:for-each>

注意:相关部分的XML文档的实际结构如下所示:
<MillSetupSheetAttr>
    <MillOperation>
        <rep_Tool ToolStnNo="10" .../>
    </MillOperation>
    <MillOperation>
        <rep_Tool ToolStnNo="1" .../>
    </MillOperation>
    <MillOperation>
        <rep_Tool ToolStnNo="2" .../>
    </MillOperation>
</MillSetupSheetAttr>   

这是一个很大的文件。我可以通过Dropbox发送给您吗?https://www.dropbox.com/sh/4mu1riun45h8tot/AABAZgsqXj-aPA2QoaF9nDo3a?dl=0 - Bruno Dias Vasconcelos
给我们展示一个体现此结构的摘录——如果我们不知道正在处理的节点结构,就无法调试XSLT。 - Jon Egerton
你的XML文件中ToolStnNo被定义为元素,但是XSL文件却将其作为属性来访问。哪一个是正确的呢?如果你想要每个ToolStnNo元素对应一个<tr>标签,那么<xsl:for-each select="MillSetupSheetAttr/MillOperation/rep_Tool/ToolStnNo"><xsl:sort select="." data-type="number"/><tr></tr></xsl:for-each>可以按照要求排序。 - andyb
我对XSLT不是很了解。我的ToolStnNo是我用来创建表格并想按照此元素ToolStnNo排序的元素。 - Bruno Dias Vasconcelos
1
您的问题无法使用发布的代码进行复现:http://xsltransform.net/6qVRKwx - michael.hor257k
显示剩余7条评论
1个回答

2

您在问题中展示的XML并不代表您实际的XML(在问题中展示代表性的例子非常重要,因为否则当文件从Dropbox中消失时,这个问题的上下文可能会丢失)。

以下是更加代表您XML的内容:

<Data>
  <MillSetupSheetAttr>
    <MillOperation>
        <rep_Tool ToolStnNo="10" .../>
    </MillOperation>
    <MillOperation>
        <rep_Tool ToolStnNo="1" .../>
    </MillOperation>
  </MillSetupSheetAttr>  
  <MillSetupSheetAttr>
    <MillOperation>
        <rep_Tool ToolStnNo="12" .../>
    </MillOperation>
    <MillOperation>
        <rep_Tool ToolStnNo="3" .../>
    </MillOperation>
  </MillSetupSheetAttr> 
</Data>

您有多个MillSetupSheetAttr元素,您遇到的问题是因为您当前有一个嵌套的xsl:for-each...

<xsl:for-each select="MillSetupSheetAttr">
    <xsl:for-each select="MillOperation"> 
        <xsl:sort select="rep_Tool/@ToolStnNo" data-type="number"/>

这意味着它将分别对每个MillSetupSheetAttr元素中的MillOperation元素进行排序。因此,您将首先获得第一个MillSetupSheetAttr的排序后的MillOperation,然后是第二个MillSetupSheetAttr的排序后的MillOperation
要解决这个问题,您应该将两个xsl:for-each语句合并为一个:
<xsl:for-each select="MillSetupSheetAttr/MillOperation"> 
    <xsl:sort select="rep_Tool/@ToolStnNo" data-type="number"/>
    <tr>
       <td><font><xsl:value-of select="rep_Tool/@ToolStnNo"/></font></td>
    </tr>
</xsl:for-each>

这将一次性排序所有的MillOperation元素。

抱歉,我在这种网站和XSL语言方面都很新。我会考虑你的建议,谢谢你的帮助,我的朋友。 - Bruno Dias Vasconcelos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接