1

我正在学习 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

如果我误解了什么,请告诉我

提前致谢。

4

2 回答 2

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>
于 2013-03-01T12:53:38.097 回答
1

前面的元素是下面用“*”标记的元素

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

你会看到有六个。

于 2013-03-01T13:58:47.210 回答