我有这个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>