在XPath和XSLT中使用Preceding轴时出现问题

时间:2013-03-01 12:38:27

标签: xslt xpath

我正在学习XSLT 2.0和XPath。在创建示例时,我遇到了XPath中可用的前一轴,并创建了下面的示例。

请找到以下用作输入的order.xml文件。

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Order id="12345">
    <Item>
        <ItemId>007</ItemId>
        <ItemName>iPhone 5</ItemName>
        <Price>500</Price>
        <Quantity>1</Quantity>
    </Item>
    <Item>
        <ItemId>456</ItemId>
        <ItemName>Ipad</ItemName>
        <Price>600</Price>
        <Quantity>2</Quantity>
    </Item>
    <Item>
        <ItemId>7864567</ItemId>
        <ItemName>Personal Development Book</ItemName>  
        <Price>10</Price>
        <Quantity>10</Quantity>
    </Item>
    <Item>
        <ItemId>123</ItemId>
        <ItemName>Java Book</ItemName>
        <Price>20</Price>
        <Quantity>12</Quantity>
    </Item>
</Order>

请找到以下用于转换上述XML的XSLT testaxis.xsl文件。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
     <xsl:value-of select="count(/Order/Item[ItemName='Ipad']/ItemName/preceding::*)" />
</xsl:template>

转换后的输出是 的 6

如果我没有错,这里的上下文节点低于一。

<ItemName>Ipad</ItemName>

如果我们计算上下文节点之前的所有节点,则计数到 5 。 现在提出问题,为什么它在输出中显示节点的计数为 6

如果我误解了任何内容,请告诉我

提前致谢。

2 个答案:

答案 0 :(得分:1)

您对哪个节点是上下文节点是正确的,并且该节点 有6个前面的元素:

  • 第一个<Item>元素。
  • 里面的四个元素。
  • 紧邻上下文节点之前的<ItemId>元素。

这就是六点。您可以通过执行以下操作来验证这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text" />
 <xsl:template match="/">
   <xsl:for-each select="/Order/Item[ItemName='Ipad']/ItemName/preceding::*">
     <xsl:value-of select="concat(name(), '&#xA;')" />
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

前面的元素是下面标有“*”

的元素
<*Item>
    <*ItemId>007</ItemId>
    <*ItemName>iPhone 5</ItemName>
    <*Price>500</Price>
    <*Quantity>1</Quantity>
</Item>
<Item>
    <*ItemId>456</ItemId>

你会看到其中有六个。