1

XSLT2.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の変換に使用される以下のXSLTtestaxis.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です

私が間違っていなければ、ここでコンテキストノードは1より下にあります。

<ItemName>Ipad</ItemName>

コンテキストノードの前にあるすべてのノードをカウントすると、カウントは5になります。ここで質問になりますが、なぜ出力にノードの数が6として表示されているのですか?

何か誤解があったら教えてください

前もって感謝します。

4

2 に答える 2

1

どのノードがコンテキスト ノードであるかについては正しく、そのノードに先行する 6 つの要素があります。

  • 最初の<Item>要素。
  • その中の4つの要素。
  • <ItemId>コンテキスト ノードの直前の要素。

それは6つになります。これは、次の手順で確認できます。

<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>

それらが6つあることがわかります。

于 2013-03-01T13:58:47.210 に答える