我有一个源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。
现在问题是,如何填写数字序列,而不添加任何重复数据?