XSL:position()函数和Counting:不准确的结果

时间:2014-10-22 18:55:49

标签: xml xslt xpath indexing position

所以我一直在努力理解为什么当我输入看似正确的语法时,XPath没有返回正确的值(语法方面)。

此处的目标是创建一个Gs1标签,显示“容器”的总数量以及哪个容器是当前容器。 ({total}的容器{i})

在此特定示例中,for each循环遍历ASNShipmentContainers部分,并了解ASNShipmentContainers中有6个ASNShipmentContainer,因此打印出6个不同的标签。

我认为position()函数是返回foreach循环所在迭代的最佳方法。我上下搜索,并意识到这将是最简单和正确的方法。但是在实现它时,它会在每个标签上不断返回“1”而不是递增。

此外,当我尝试查找总容器的值时,我使用:count(ASNShipmentContainers / ASNShipmentContainer),它与foreach循环中声明的值相同,并且应该返回我的总容器值6.但是这也会返回1.

以下是相关代码:

<xsl:variable name="ROOT" select="." />
<!--For each loop, knows there are 6 iterations-->
<xsl:for-each select="ASNShipmentContainers/ASNShipmentContainer">

    <Section Margins="5,5">


          <!--Start creation of table that will display info here-->
          <Table Width="275" Height="30" Margins="161,0,0,0">
            <Row Height="100%">
                <Cell Borders="Black" Width=".125"/>
                    <Cell Width="274.375">
                        <Text>Count:<xsl:value-of select="position()" /> of <xsl:value-of select="count(ASNShipmentContainers/ASNShipmentContainer))" /></Text>
                    </Cell>
                <Cell Borders="Black" Width=".5"/>
              </Row>
            </Table>


</Section>

</xsl:for-each>

那么为什么当我这样做时,位置和总容器数量的值都是“1”。我的理解是,即使在for-each循环中调用它,它也应该起作用。

另外,如果我要求计算容器,我不应该收到总数吗?为什么它会给我一个1.

我唯一可以想象的是,我的范围在某种程度上取决于我的循环/选择语句。这需要另外使用吗?

编辑: 感谢您的快速回复,但问题实际上与XSL无关。 在最终与之前使用过此代码的人合作之后,他向我解释说问题来自我们的C#代码,而不是XSL本身。 C#会删除它当前没有处理的所有元素,因此每次我尝试计算所有元素时,它会给我一个,因为从技术上讲,只有一个。

谢谢。

1 个答案:

答案 0 :(得分:2)

当您处于以下情况时:

<xsl:for-each select="ASNShipmentContainers/ASNShipmentContainer">

表达式:

count(ASNShipmentContainers/ASNShipmentContainer)

尝试计算作为当前节点的子节点的ASNShipmentContainer子节点的ASNShipmentContainers元素。我不认为这就是你想要的。

要计算当前级别的ASNShipmentContainer元素,请尝试:

count(../ASNShipmentContainer)

或 - 最好 - 在调用for-each之前定义一个带有计数的变量,以避免重复计算相同的事物。

不确定你对position()的问题是什么 - 你必须发布一个更全面的例子,以便我们能够重现这个问题。