4

私はこのようなXMLを持っています - (簡略化)

<OrderBundle>
    <BundleDetail>
        <BundleId>12312</BundleId>
        <BundleUnit>
            <Idset>
                <PartNo>807651</PartNo>
            </Idset>
        </BundleUnit>
    </BundleDetail>
    <BundleDetail>
        <BundleId>12112</BundleId>
        <BundleUnit>
            <Idset>
                <PartNo>807650</PartNo>
            </Idset>
        </BundleUnit>
    </BundleDetail>
    <BundleDetail>
        <BundleId>12412</BundleId>
        <BundleUnit>
            <Idset>
                <PartNo>807651</PartNo>
            </Idset>
        </BundleUnit>
    </BundleDetail>
    <BundleDetail>
        <BundleId>12612</BundleId>
        <BundleUnit>
            <Idset>
                <PartNo>807651</PartNo>
            </Idset>
        </BundleUnit>
    </BundleDetail>
</OrderBundle>

この XSL を使用して、ループ内の同様のノードの前の値を見つけています。ここで xsl を簡略化しました。このロジックをより大きなセットに収める必要があります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:template match="/">

  <html>
  <body>

    <table border="1">
        <tr>
            <th>Bundle Id</th>
            <th>PartNo</th>
            <th>PreviousValue</th>
        </tr>
      <xsl:for-each select="/OrderBundle/BundleDetail">
      <tr>
        <td> <xsl:value-of select="BundleId"/></td>
        <td><xsl:value-of select=" BundleUnit/Idset/PartNo" /> </td>
        <td> ?? <xsl:value-of select="ancestor::BundleUnit/Idset/PartNo"/>   </td>
      </tr>
      </xsl:for-each>
    </table>


  </body>
  </html>
</xsl:template>

先祖と前の兄弟で試しましたが、うまくいきません..以下の結果を期待しています

B.Id  PartNo PreviousValue 
12312 807651 ??             --
12112 807650 ??             -- 807651 
12412 807651 ??             -- 807650 etc
12612 807651 ??  

アイデアはありますか?

4

2 に答える 2

8

使用:

preceding-sibling::BundleDetail[1]/BundleUnit/Idset/PartNo

完全な変換は次のようになります。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:template match="/">

      <html>
      <body>

        <table border="1">
            <tr>
                <th>Bundle Id</th>
                <th>PartNo</th>
                <th>PreviousValue</th>
            </tr>
          <xsl:for-each select="/OrderBundle/BundleDetail">
          <tr>
            <td> <xsl:value-of select="BundleId"/></td>
            <td><xsl:value-of select=" BundleUnit/Idset/PartNo" /> </td>
            <td><xsl:value-of
            select="preceding-sibling::BundleDetail[1]/BundleUnit/Idset/PartNo"/>   </td>
          </tr>
          </xsl:for-each>
        </table>


      </body>
      </html>
    </xsl:template>
</xsl:stylesheet>

そして、必要な正しい結果が生成されます:

<html xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <body>
      <table border="1">
         <tr>
            <th>Bundle Id</th>
            <th>PartNo</th>
            <th>PreviousValue</th>
         </tr>
         <tr>
            <td>12312</td>
            <td>807651</td>
            <td></td>
         </tr>
         <tr>
            <td>12112</td>
            <td>807650</td>
            <td>807651</td>
         </tr>
         <tr>
            <td>12412</td>
            <td>807651</td>
            <td>807650</td>
         </tr>
         <tr>
            <td>12612</td>
            <td>807651</td>
            <td>807651</td>
         </tr>
      </table>
   </body>
</html>
于 2012-07-27T12:57:06.823 に答える
2

<xsl:value-of select="preceding-sibling::BundleDetail[1]/BundleUnit/Idset/PartNo"/>はあなたが探しているものだと思います。

于 2012-07-27T12:56:26.213 に答える