Xslt 排序数字

Xslt sort numbers

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

  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>
    ...

我得到的结果 table 是:

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>   

您在问题中显示的 XML 并不代表您的实际 XML(重要的是在您的问题中显示一个有代表性的示例,否则当文件从 drop 中消失时-box,这个问题的上下文可能会丢失)。

这将更能代表您的 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 个元素进行排序。