0

たとえば、次のような XML があります。

<ProcessPurchaseOrder >
    <PurchaseOrderLine>
        <DocumentReference type="sendersReference2">
            <DocumentID>
                <ID>100</ID>
            </DocumentID>
        </DocumentReference>
        <DocumentReference type="sendersReference3">
            <DocumentID>
                <ID>ru</ID>
            </DocumentID>
        </DocumentReference>
        <Item>
            <CustomerItemID>
                <ID>00126</ID>
            </CustomerItemID>
        </Item>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DocumentReference type="sendersReference2">
            <DocumentID>
                <ID>200</ID>
            </DocumentID>
        </DocumentReference>
        <DocumentReference type="sendersReference3">
            <DocumentID>
                <ID>ru</ID>
            </DocumentID>
        </DocumentReference>
        <Item>
            <CustomerItemID>
                <ID>123122</ID>
            </CustomerItemID>
        </Item>
    </PurchaseOrderLine>
</ProcessPurchaseOrder>

および XSLT の一部:

 <xsl:for-each select="*:PurchaseOrderLine">
    <xsl:variable name="ArtNr" select="*:Item/*:CustomerItemID/*:ID"/>
    <xsl:variable name="WepNr" select="/*/DbResponse/ResultSet/Row[Cell[@name='ARTNR']=$ArtNr][Cell[@name='WEANR']=$WeaNr]/Cell[@name='WEPNR']"/>
    <xsl:copy>
        <xsl:if test="$WepNr!=''">
            <xsl:for-each select="$WepNr">
                <LineNumber><xsl:value-of select="$WepNr/current()"/></LineNumber>
            </xsl:for-each>
        </xsl:if>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:for-each>

すべての値について、全体をコピーして現在の値で挿入し$WepNrたい。<PurchaseOrderLine><LineNumber>WepNr

例:$WepNr最初の PurchaseOrderLine の場合: 16; 26 結果は次のようになります。

<ProcessPurchaseOrder >
    <PurchaseOrderLine>
    <!-- wepnr[1] = 16 -->
    <LineNumber>16</LineNumber>
        <DocumentReference type="sendersReference2">
            <DocumentID>
                <ID>100</ID>
            </DocumentID>
        </DocumentReference>
        <DocumentReference type="sendersReference3">
            <DocumentID>
                <ID>ru</ID>
            </DocumentID>
        </DocumentReference>
        <Item>
            <CustomerItemID>
                <ID>00126</ID>
            </CustomerItemID>
        </Item>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
    <!-- copied PurchaseOrderLine with wepnr[2]=26 -->
    <LineNumber>26</LineNumber>
        <DocumentReference type="sendersReference2">
            <DocumentID>
                <ID>100</ID>
            </DocumentID>
        </DocumentReference>
        <DocumentReference type="sendersReference3">
            <DocumentID>
                <ID>ru</ID>
            </DocumentID>
        </DocumentReference>
        <Item>
            <CustomerItemID>
                <ID>00126</ID>
            </CustomerItemID>
        </Item>
    </PurchaseOrderLine>

    <!-- here is 2nd PurchaseOrderLine>
    <!-- ... -->

</ProcessPurchaseOrder>

出来ますか?

UPD : DBresponse XML 部分

<DbResponse>
   <ResultSet>
      <Row>
         <Cell name="WEANR" type="VARCHAR2">1909123</Cell>
         <Cell name="ARTNR" type="VARCHAR2">00126</Cell>
         <Cell name="WEPNR" type="VARCHAR2">1</Cell>
      </Row>
      <Row>
         <Cell name="WEANR" type="VARCHAR2">1909123</Cell>
         <Cell name="ARTNR" type="VARCHAR2">00126</Cell>
         <Cell name="WEPNR" type="VARCHAR2">16</Cell>
      </Row>
   </ResultSet>
</DbResponse>

WepNrが複数の値を返す可能性があることを意味するだけです:1 16この場合は " " のように

4

1 に答える 1

1

代わりに思う

 <xsl:for-each select="*:PurchaseOrderLine">
    <xsl:variable name="ArtNr" select="*:Item/*:CustomerItemID/*:ID"/>
    <xsl:variable name="WepNr" select="/*/DbResponse/ResultSet/Row[Cell[@name='ARTNR']=$ArtNr][Cell[@name='WEANR']=$WeaNr]/Cell[@name='WEPNR']"/>
    <xsl:copy>
        <xsl:if test="$WepNr!=''">
            <xsl:for-each select="$WepNr">
                <LineNumber><xsl:value-of select="$WepNr/current()"/></LineNumber>
            </xsl:for-each>
        </xsl:if>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:for-each>

あなたはむしろ欲しい:

 <xsl:apply-templates select="*:PurchaseOrderLine"/>

そしてトップレベルで

 <xsl:key name="row-by-wepnr" 
   match="DbResponse/ResultSet/Row"
   use="Cell[@name='ARTNR']"/>


 <xsl:template match="*:PurchaseOrderLine">
   <xsl:variable name="this" select="."/>
   <xsl:variable name="wepNrs" select="key('row-by-wepnr', *:Item/*:CustomerItemID/*:ID)[Cell[@name='WEANR']=$WeaNr]/Cell[@name='WEPNR']"/>
   <xsl:for-each select="$wepNrs">
     <xsl:apply-templates select="$this" mode="add-wep">
       <xsl:with-param name="wep" select="current()"/>
     </xsl:apply-templates>
   </xsl:for-each>
 </xsl:template>

 <xsl:template match="*:PurchaseOrderLine" mode="add-wep">
    <xsl:param name="wep"/>
    <xsl:copy>
      <LineNumber><xsl:value-of select="$wep"/></LineNumber>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

それは$WearNrグローバルなパラメーターまたは変数であると想定しています。そうでない場合は、その値を渡す必要があります。

 <xsl:apply-templates select="*:PurchaseOrderLine">
   <xsl:with-param name"WearNr" select="$WearNr"/>
  </xsl:apply-templates>

 <xsl:template match="*:PurchaseOrderLine">
   <xsl:param name="$WearNr"/>
   <xsl:variable name="this" select="."/>
   <xsl:variable name="wepNrs" select="key('row-by-wepnr', *:Item/*:CustomerItemID/*:ID)[Cell[@name='WEANR']=$WeaNr]/Cell[@name='WEPNR']"/>
   <xsl:for-each select="$wepNrs">
     <xsl:apply-templates select="$this" mode="add-wep">
       <xsl:with-param name="wep" select="current()"/>
     </xsl:apply-templates>
   </xsl:for-each>
 </xsl:template>

 <xsl:template match="*:PurchaseOrderLine" mode="add-wep">
    <xsl:param name="wep"/>
    <xsl:copy>
      <LineNumber><xsl:value-of select="$wep"/></LineNumber>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

もちろん、すべてテストされていないため、テスト可能なコードを記述できるように、最小限ではあるが完全なコード サンプルを提供することをお勧めします。

于 2012-10-08T11:58:20.037 に答える