所以我一直在努力理解为什么当我输入看似正确的语法时,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#会删除它当前没有处理的所有元素,因此每次我尝试计算所有元素时,它会给我一个,因为从技术上讲,只有一个。
谢谢。
答案 0 :(得分:2)
当您处于以下情况时:
<xsl:for-each select="ASNShipmentContainers/ASNShipmentContainer">
表达式:
count(ASNShipmentContainers/ASNShipmentContainer)
尝试计算作为当前节点的子节点的ASNShipmentContainer
子节点的ASNShipmentContainers
元素。我不认为这就是你想要的。
要计算当前级别的ASNShipmentContainer
元素,请尝试:
count(../ASNShipmentContainer)
或 - 最好 - 在调用for-each
之前定义一个带有计数的变量,以避免重复计算相同的事物。
不确定你对position()的问题是什么 - 你必须发布一个更全面的例子,以便我们能够重现这个问题。