排序后跟踪位置

时间:2011-06-07 18:37:21

标签: xml xslt

我一直在尝试将xsl应用于Analysis Service数据库返回的结果集。 结果集如下所示......

<Axis name="Axis1">
  <Tuples>
    <Tuple>
      <Member Hierarchy="[Org].[Class1]">
        <UName>[Org].[Class1].&amp;[10629]</UName>
        <Caption>Independent</Caption>
        <LName>[Org].[Class1].[Ownership]</LName>
        <LNum>2</LNum>
        <DisplayInfo>65898</DisplayInfo>
        <PARENT_UNIQUE_NAME>[Org].[Class1].&amp;[2]</PARENT_UNIQUE_NAME>
      </Member>
    </Tuple>
    <Tuple>
      <Member Hierarchy="[Org].[Class1]">
        <UName>[Org].[Class1].&amp;[14331]</UName>
        <Caption>A #5839</Caption>
        <LName>[Org].[Class1].[Owner Region]</LName>
        <LNum>3</LNum>
        <DisplayInfo>65537</DisplayInfo>
        <PARENT_UNIQUE_NAME>[Org].[Class1].&amp;[10629]</PARENT_UNIQUE_NAME>
      </Member>
    </Tuple>
    ....
  </Tuples>
</Axis>

<CellData>
  <Cell CellOrdinal="0">
    <FmtValue>Ownership</FmtValue>
  </Cell>
  <Cell CellOrdinal="1">
    <ForeColor>0</ForeColor>
    <FmtValue>73%</FmtValue>
  </Cell>
  <Cell CellOrdinal="2">
    <ForeColor>0</ForeColor>
    <FmtValue>68%</FmtValue>
  </Cell>
  <Cell CellOrdinal="3">
    <ForeColor>0</ForeColor>
    <FmtValue>70%</FmtValue>
  </Cell>
  <Cell CellOrdinal="4">
    <ForeColor>0</ForeColor>
    <FmtValue>59%</FmtValue>
  </Cell>
  <Cell CellOrdinal="5">
    <FmtValue>Owner Region</FmtValue>
  </Cell>
  <Cell CellOrdinal="6">
    <ForeColor>0</ForeColor>
    <FmtValue>75%</FmtValue>
  </Cell>
  .....
</CellData>

上面的每个元组在CellData中都有一组相应的Cell。 因此,如果按顺序解析文件,则可以使用元组的position()收集相关单元格。

但是,如果使用xsl-sort,LNum属性对元组进行排序,并使用for-each迭代,则元组的位置现在已更改,因此无法找到元组的相应单元格。

如何根据UName跟踪元组序数,以便我可以进入相关单元格。
我已经为UName创建了一个键

<xsl:key name="tuples-by-uName" match="/xa:root/xa:Axes/xa:Axis/xa:Tuples/xa:Tuple" use="xa:Member/xa:UName" />
<xsl:key name="tuples-by-parentUName" match="/xa:root/xa:Axes/xa:Axis/xa:Tuples/xa:Tuple" use="xa:Member/xa:PARENT_UNIQUE_NAME" />

并希望使用以下内容迭代元组。

<xsl:for-each select="key('tuples-by-parentUName', $thisQuestion/xa:Member/xa:UName)">
<xsl:sort data-type="number" select="xa:Member/xa:LNum" order="descending"/>

这里我需要元组的原始位置,以便我可以计算出细胞的位置。

花了很多时间,但无法想出这个。

1 个答案:

答案 0 :(得分:1)

xsl:for-each

<xsl:variable name="originalPosition" select="count(preceding::xa:Tuple) + 1"/>

<xsl:variable name="originalPosition">
    <xsl:number count="xa:Tuple" level="any"/>
</xsl:variable>