在XSLT中填写序列中缺少的数字

时间:2014-06-30 14:43:46

标签: xml xslt-1.0

我有一个源xml文件,其中包含测试及其结果,以及这些测试的索引。输入格式大致如下:

源XML:

<Test>
  <Name>Test1</Name>
  <Results>
    <Item>
      <Name>Result1</Name>
      <Row>0</Row>
      <Col>0</Col>
    </Item>
    <Item>
      <Name>Result2</Name>
      <Row>0</Row>
      <Col>-1</Col>
    </Item>
    <Item>
      <Name>Result3</Name>
      <Row>0</Row>
      <Col>-1</Col>
    </Item>
    <Item>
      <Name>Result4</Name>
      <Row>0</Row>
      <Col>2</Col>
    </Item>
  </Results>
</Test>

我想拥有与以前相同的结构,但每个索引(无论是行还是列)都是-1,必须自动递增,从0开始。应该没有重复,所以Result2不应该得到其列为0,而1为1,Result3的列值为3.&#39; -1&#39;是一种表示动态索引的形式,它不是事先定义的,而是在其他一些转换之后(在我想要进行索引序列更改之前执行)。
根据索引(名称中通常没有任何数字),将在稍后进行排序。

我尝试使用位置()或键,但无法找到一种方法来使用它们,这将解决我手头的问题。现在我只有一个向上计数的转换,而不考虑任何其他现有的相同值的索引。

XSLT:

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Results">
  <xsl:for-each select="Item/Col">
    <xsl:choose>
      <xsl:when test="Item/Col = -1">
        <xsl:value-of select="position()-1"/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:value-of select="Item/Col"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</xsl:template>

期望输出:

<Test>
  <Name>Test1</Name>
  <Results>
    <Item>
      <Name>Result1</Name>
      <Row>0</Row>
      <Col>0</Col>
    </Item>
    <Item>
      <Name>Result2</Name>
      <Row>0</Row>
      <Col>1</Col>
    </Item>
    <Item>
      <Name>Result4</Name>
      <Row>0</Row>
      <Col>2</Col>
    </Item>
    <Item>
      <Name>Result3</Name>
      <Row>0</Row>
      <Col>3</Col>
    </Item>
  </Results>
</Test>

源本身没有重复,只有多个&#39; -1&#39;索引是可能的。输出应该没有重复项,索引也不应该为-1。

现在问题是,如何填写数字序列,而不添加任何重复数据?

0 个答案:

没有答案