0

私は次のXMLを持っています

<Root>
<PW>
  <Wec>
    <ID>11425</ID>
    <Data>
      <item>A3400301040TT01</item>
      <item>A3400301040TT02</item>
      <item>A3400301040TT03</item>
    </Data>
  </Wec>
  <Wec>
    <Data>
    <ID>11426</ID>
      <item>A3400302040TT01</item>
      <item>A3400302040TT03</item>
      <item>A3400302040TT02</item>
    </Data>
  </Wec>
</PW>
<PWSlots>
  <Rec>11</Rec>
  <Rec>12</Rec>
  <Rec>13</Rec>
  <Rec>14</Rec>
  <Rec>16</Rec>
  <Rec>15</Rec>
</PWSlots>
</Root>

そして、このようなxmlを生成したい

<Root>
<PW>
  <Wec>
    <ID>11425</ID>
    <Data>
      <Item id="A3400301040TT01" slotNumber="11"/>
      <item id="A3400301040TT02" slotNumber="12"/>
      <item id="A3400301040TT03" slotNumber="13"/>
    </Data>
  </Wec>
  <Wec>
    <ID>11426</ID>
    <Data>        
      <item id="A3400302040TT01" slotNumber="14"/>
      <item id="A3400302040TT03" slotNumber="16"/>
      <item id="A3400302040TT02" slotNumber="15"/>
    </Data>
  </Wec>
</PW>
</Root>   

さて、私はすべての Wec タグに対して xsl:foreach を実行しており、その foreach 内には、各 item タグをループする別の foreach があります。特定の Wec ノード内でループしているため、アイテムの一部としてスロットを含めようとすると問題が発生します。

PWSlots から割り当てる必要がある特定の Rec タグを知るために、特定のアイテム タグに基づいて (xml 文字列全体で) そのアイテム ノードの現在の発生を取得できるメカニズムが必要です。

例を挙げると、最初の Wec タグ (ID 11425) でループしています。これはノード項目の最初の発生であるため、PWSlots の下にある最初の Rec タグの値を割り当てる必要があります。

XSLを使用してこれを行う方法についてのアイデアはありますか?? あなたの助けに感謝

4

2 に答える 2

2

@ダニエルのアプローチの方が好きです。しかし、ここに別の解決策があります:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" encoding="utf-8" indent="yes" />

   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
   </xsl:template>

   <!-- remove PWSlots -->
   <xsl:template match="PWSlots" />

   <xsl:template match="item">
      <xsl:variable name="id" select="normalize-space()" />
      <xsl:variable name="pos">
         <xsl:for-each select="//item">
            <xsl:if test="normalize-space(.)=$id">
               <xsl:value-of select="position()" />
            </xsl:if>
         </xsl:for-each>
      </xsl:variable>
      <Item id="{.}">
         <xsl:attribute name="slotNumber">
            <xsl:value-of select="//PWSlots/Rec[number($pos)]" />
         </xsl:attribute>
      </Item>
   </xsl:template>
</xsl:stylesheet>
于 2013-10-05T04:29:59.663 に答える