XSL position() 始终返回"1"



我有这个XML,我计划获得每个名称的位置,但它总是返回"1"。使用以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<main>
<collection>
<item>Paul</item>
<item>John</item>
<item>Peter</item>
</collection>
</main>

我使用了这个变换

<xsl:for-each select="main/collection">
<xsl:variable name="itemName" select="./item" />
<xsl:variable name="counter" select="position()" />
<tr> 
<td><xsl:value-of select ="$counter"/></td> 
<td><xsl:value-of select ="$itemName"/></td>
</tr> 
</xsl:for-each>
<!-- desired output is position then name (for brevity purposes): -->
<!-- 1 - Paul  -->
<!-- 2 - John  -->
<!-- 3 - Peter  -->
<!-- but the actual output is like this (for brevity purposes): -->
<!-- 1 - Paul  -->
<!-- 1 - John  -->
<!-- 1 - Peter  -->

如果我执行上面的代码,"counter"变量总是返回1。我在其他文章中读到,使用XSL的问题是不能更改变量(它更像是您正在设置的常量)。因此,递增计数器变量也不起作用。

编辑:更复杂的XML
<?xml version="1.0" encoding="UTF-8"?>
<resource ofType="personCollection">
<personSetList>
<personSet>
<descriptorList>
<person>
<personList>
<personType>Person</personType>
</personList>
<personTerm format="plain-text">
<personText>Paul</personText>
</personTerm>
</person>
<person>
<personList>
<personType>Person</personType>
</personList>
<personTerm format="plain-text">
<personText>John</personText>
</personTerm>
</person>
<person>
<personList>
<personType>subject-heading</personType>
</personList>
<personTerm format="plain-text">
<personText>Peter</personText>
</personTerm>
</person>
</personList>
</personSet>
</personSetList>
</resource>

和XSL:

<xsl:template match="<my-match-query>" mode="edges">    
<xsl:for-each select="descriptorList/person/personTerm/personText">      
<!-- other declarations -->
<xsl:variable name="counter" select="position()" />

<xsl:call-template name="templateToProcess">
<xsl:with-param name="hierarchy" select="$counter" />
<xsl:with-param name="name" select="." />
</xsl:call-template>
</xsl:for-each>    
</xsl:template>

输入中只有一个collection,因此指令<xsl:for-each select="main/collection">将只执行一次。要获得结果,您指示您应该执行以下操作:

<xsl:for-each select="main/collection/item">
<xsl:variable name="itemName" select="." />
<xsl:variable name="counter" select="position()" />
<tr> 
<td><xsl:value-of select ="$counter"/></td> 
<td><xsl:value-of select ="$itemName"/></td>
</tr> 
</xsl:for-each>
</xsl:template>

最新更新