Xslt 2.0 插入计算元素

Xslt 2.0 插入计算元素,xslt-2.0,Xslt 2.0,我对XSLT比较陌生,在一些应该相对简单的问题上遇到了重大问题。我在互联网上搜索了两天,但还是没能克服这个问题的最后一个障碍 下面是我要转换的XML的一个简单版本: <Payment xmlns="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xxxxxx.com/C

我对XSLT比较陌生,在一些应该相对简单的问题上遇到了重大问题。我在互联网上搜索了两天,但还是没能克服这个问题的最后一个障碍

下面是我要转换的XML的一个简单版本:

<Payment xmlns="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema.xsd ">
<Transaction>
    <POSellerName>DAF KNITWEARS LTD. (PG)</POSellerName>
    <PayeeName>883456789</PayeeName>
    <CurrencyCode>USD</CurrencyCode>
    <WTLCNumber>O0910122</WTLCNumber>
    <VendorAppNumber>6031</VendorAppNumber>
    <DocumentNumber>BEAI12000094</DocumentNumber>
    <PODetail>
        <PONumber>0887537</PONumber>
        <QuantityShipped>2550</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>13226.37</AmountBilled>
    </PODetail>
    <PODetail>
        <PONumber>0887567</PONumber>
        <QuantityShipped>150</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>873</AmountBilled>
    </PODetail>
  <ChargeBackDetail>
    <PONumber>0887567</PONumber>
    <CurrencyCode>USD</CurrencyCode>
    <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
    <ChargeBackReferenceNumber>CB0872364C</ChargeBackReferenceNumber>
    <UPC/>
  </ChargeBackDetail>
  <ChargeBackDetail>
    <PONumber>0872355</PONumber>
    <CurrencyCode>USD</CurrencyCode>
    <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
    <ChargeBackReferenceNumber>CB0872355A</ChargeBackReferenceNumber>
    <UPC/>
  </ChargeBackDetail>
</Transaction>
</Payment>

达夫针织品有限公司(PG)
883456789
美元
O0910122
6031
BEAI12000094
0887537
2550
过程控制系统
美元
13226.37
0887567
150
过程控制系统
美元
873
0887567
美元
-105
CB0872364C
0872355
美元
-105
CB0872355A
我想在每个名为的
的末尾插入一个元素

<AmountPaid>.
因此,我处理每个
,并在各自的元素中查找具有相同值的
。如果找到,元素的值将为/PODetail/Amountbilled-/ChargeBackDetail/ChargeBackAllocationAmount,否则该值将等于/PODetail/Amountbilled。以下是PONumber元素的预期结果

  <PODetail>
    <PONumber>0887537</PONumber>
    <QuantityShipped>2550</QuantityShipped>
    <UnitOfMeasure>PCS</UnitOfMeasure>
    <CurrencyCode>USD</CurrencyCode>
    <AmountBilled>13226.37</AmountBilled>
    <AmountPaid>13226.37</AmountPaid>
</PODetail>
<PODetail>
    <PONumber>0887567</PONumber>
    <QuantityShipped>150</QuantityShipped>
    <UnitOfMeasure>PCS</UnitOfMeasure>
    <CurrencyCode>USD</CurrencyCode>
    <AmountBilled>873</AmountBilled>
    <AmountPaid>768</AmountPaid>
</PODetail>

0887537
2550
过程控制系统
美元
13226.37
13226.37
0887567
150
过程控制系统
美元
873
768
这是我的XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:pf="http://www.WellsFargo.com/CIB/GIFTS/TradeERP/PaymentFileSchema">

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

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

<xsl:variable name="poNumber" select="pf:PONumber"/>
<xsl:variable name="poAmountBilled" select="number(pf:AmountBilled)"/>

<xsl:for-each select="//pf:Transaction/pf:ChargeBackDetail">
    <xsl:variable name="poNumber" select="pf:PODetail/pf:PONumber"/>
    <xsl:variable name="cbPONumber" select="./pf:ChargeBackDetail/pf:PONumber"/>
    <xsl:variable name="cbAmount" select="number(./pf:ChargeBackDetail/pf:ChargeBackAllocationAmount)"/>

        <xsl:if test='$poNumber = $cbPONumber'> 
            <AmountPaid><xsl:number value="$poAmountBilled - $cbAmount"/></AmountPaid>
        </xsl:if>

</xsl:for-each>

 <xsl:if test ="not(pf:AmountPaid)">
<AmountPaid><xsl:number value="$poAmountBilled"/> </AmountPaid> 
 </xsl:if> 

</xsl:copy>
</xsl:template>

 </xsl:stylesheet>

任何帮助都将不胜感激


基因

这种转化

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:x="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema" exclude-result-prefixes="x">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="x:PODetail">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
   <xsl:element name="AmountPaid"
                namespace="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema">
     <xsl:sequence select=
     "sum((x:AmountBilled,
          ../x:ChargeBackDetail[x:PONumber eq current()/x:PONumber]
                          /x:ChargeBackAllocationAmount))"/>
   </xsl:element>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<Payment xmlns="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema.xsd ">
<Transaction>
    <POSellerName>DAF KNITWEARS LTD. (PG)</POSellerName>
    <PayeeName>883456789</PayeeName>
    <CurrencyCode>USD</CurrencyCode>
    <WTLCNumber>O0910122</WTLCNumber>
    <VendorAppNumber>6031</VendorAppNumber>
    <DocumentNumber>BEAI12000094</DocumentNumber>
    <PODetail>
        <PONumber>0887537</PONumber>
        <QuantityShipped>2550</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>13226.37</AmountBilled>
    </PODetail>
    <PODetail>
        <PONumber>0887567</PONumber>
        <QuantityShipped>150</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>873</AmountBilled>
    </PODetail>
  <ChargeBackDetail>
    <PONumber>0887567</PONumber>
    <CurrencyCode>USD</CurrencyCode>
    <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
    <ChargeBackReferenceNumber>CB0872364C</ChargeBackReferenceNumber>
    <UPC/>
  </ChargeBackDetail>
  <ChargeBackDetail>
    <PONumber>0872355</PONumber>
    <CurrencyCode>USD</CurrencyCode>
    <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
    <ChargeBackReferenceNumber>CB0872355A</ChargeBackReferenceNumber>
    <UPC/>
  </ChargeBackDetail>
</Transaction>
</Payment>
<Payment xmlns="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema.xsd ">
   <Transaction>
      <POSellerName>DAF KNITWEARS LTD. (PG)</POSellerName>
      <PayeeName>883456789</PayeeName>
      <CurrencyCode>USD</CurrencyCode>
      <WTLCNumber>O0910122</WTLCNumber>
      <VendorAppNumber>6031</VendorAppNumber>
      <DocumentNumber>BEAI12000094</DocumentNumber>
      <PODetail>
        <PONumber>0887537</PONumber>
        <QuantityShipped>2550</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>13226.37</AmountBilled>
         <AmountPaid>13226.37</AmountPaid>
      </PODetail>
      <PODetail>
        <PONumber>0887567</PONumber>
        <QuantityShipped>150</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>873</AmountBilled>
         <AmountPaid>768</AmountPaid>
      </PODetail>
      <ChargeBackDetail>
         <PONumber>0887567</PONumber>
         <CurrencyCode>USD</CurrencyCode>
         <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
         <ChargeBackReferenceNumber>CB0872364C</ChargeBackReferenceNumber>
         <UPC/>
      </ChargeBackDetail>
      <ChargeBackDetail>
         <PONumber>0872355</PONumber>
         <CurrencyCode>USD</CurrencyCode>
         <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
         <ChargeBackReferenceNumber>CB0872355A</ChargeBackReferenceNumber>
         <UPC/>
      </ChargeBackDetail>
   </Transaction>
</Payment>

达夫针织品有限公司(PG)
883456789
美元
O0910122
6031
BEAI12000094
0887537
2550
过程控制系统
美元
13226.37
0887567
150
过程控制系统
美元
873
0887567
美元
-105
CB0872364C
0872355
美元
-105
CB0872355A
生成所需的正确结果:

<Payment xmlns="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema.xsd ">
<Transaction>
    <POSellerName>DAF KNITWEARS LTD. (PG)</POSellerName>
    <PayeeName>883456789</PayeeName>
    <CurrencyCode>USD</CurrencyCode>
    <WTLCNumber>O0910122</WTLCNumber>
    <VendorAppNumber>6031</VendorAppNumber>
    <DocumentNumber>BEAI12000094</DocumentNumber>
    <PODetail>
        <PONumber>0887537</PONumber>
        <QuantityShipped>2550</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>13226.37</AmountBilled>
    </PODetail>
    <PODetail>
        <PONumber>0887567</PONumber>
        <QuantityShipped>150</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>873</AmountBilled>
    </PODetail>
  <ChargeBackDetail>
    <PONumber>0887567</PONumber>
    <CurrencyCode>USD</CurrencyCode>
    <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
    <ChargeBackReferenceNumber>CB0872364C</ChargeBackReferenceNumber>
    <UPC/>
  </ChargeBackDetail>
  <ChargeBackDetail>
    <PONumber>0872355</PONumber>
    <CurrencyCode>USD</CurrencyCode>
    <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
    <ChargeBackReferenceNumber>CB0872355A</ChargeBackReferenceNumber>
    <UPC/>
  </ChargeBackDetail>
</Transaction>
</Payment>
<Payment xmlns="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.xxxxxx.com/CIB/GIFTS/PaymentFileSchema.xsd ">
   <Transaction>
      <POSellerName>DAF KNITWEARS LTD. (PG)</POSellerName>
      <PayeeName>883456789</PayeeName>
      <CurrencyCode>USD</CurrencyCode>
      <WTLCNumber>O0910122</WTLCNumber>
      <VendorAppNumber>6031</VendorAppNumber>
      <DocumentNumber>BEAI12000094</DocumentNumber>
      <PODetail>
        <PONumber>0887537</PONumber>
        <QuantityShipped>2550</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>13226.37</AmountBilled>
         <AmountPaid>13226.37</AmountPaid>
      </PODetail>
      <PODetail>
        <PONumber>0887567</PONumber>
        <QuantityShipped>150</QuantityShipped>
        <UnitOfMeasure>PCS</UnitOfMeasure>
        <CurrencyCode>USD</CurrencyCode>
        <AmountBilled>873</AmountBilled>
         <AmountPaid>768</AmountPaid>
      </PODetail>
      <ChargeBackDetail>
         <PONumber>0887567</PONumber>
         <CurrencyCode>USD</CurrencyCode>
         <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
         <ChargeBackReferenceNumber>CB0872364C</ChargeBackReferenceNumber>
         <UPC/>
      </ChargeBackDetail>
      <ChargeBackDetail>
         <PONumber>0872355</PONumber>
         <CurrencyCode>USD</CurrencyCode>
         <ChargeBackAllocationAmount>-105</ChargeBackAllocationAmount>
         <ChargeBackReferenceNumber>CB0872355A</ChargeBackReferenceNumber>
         <UPC/>
      </ChargeBackDetail>
   </Transaction>
</Payment>

达夫针织品有限公司(PG)
883456789
美元
O0910122
6031
BEAI12000094
0887537
2550
过程控制系统
美元
13226.37
13226.37
0887567
150
过程控制系统
美元
873
768
0887567
美元
-105
CB0872364C
0872355
美元
-105
CB0872355A

谢谢你,迪米特!我试试这个。有一个愉快的周末。