每个xsl都没有使用XSLT 1.0更新所有值

时间:2015-07-06 19:23:41

标签: xslt for-loop xpath

我有一个要求,我必须根据某个Xpath条件更新值。

输入

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header/>
<S:Body>
    <ns2:ReturnUpdateRequest xmlns="urn:ibm:uscomm:service:header" xmlns:ns2="ibm:ServiceReturnUpdate" Version="1.0">
        <Header>
            <DocumentIdentifier>0001013083-1436198976111</DocumentIdentifier>
            <DocumentDateTime>2015-07-06T13:09:36.111-03:00</DocumentDateTime>
            <From>
                <PartnerName>MYibm_ONLINE</PartnerName>
                <PartnerIdentifier type="USER_ID">0001013083</PartnerIdentifier>
            </From>
            <DataSource>MYibm_ONLINE</DataSource>
        </Header>
        <ns2:ReturnUpdateRequestBody>
            <ns2:DealerEntity>
                <ns2:PartnerIdentifier Type="SAP_ID">0001013083</ns2:PartnerIdentifier>
            </ns2:DealerEntity>
            <ns2:ReturnUpdateList>
                <ns2:ReturnUpdateProperties>
                    <ns2:DocumentNumber>0020014759</ns2:DocumentNumber>
                    <ns2:PurchaseOrderNumber>CHG1</ns2:PurchaseOrderNumber>
                    <ns2:Status>SAVED</ns2:Status>
                    <ns2:DateSubmitted>0000-00-00</ns2:DateSubmitted>
                    <ns2:RequestedPickupDate/>
                    <ns2:ReturnUpdateItemDetails>
                        <ns2:DocumentNumber></ns2:DocumentNumber>
                        <ns2:ItemNumber>000010</ns2:ItemNumber>
                        <ns2:ProductInformation>
                            <ns2:ProductIdentification>
                                <ns2:ProductIdentifier Type="SAP">CANOLA</ns2:ProductIdentifier>
                                <ns2:ProductName>DKL27-20 RR 50# GSSANG</ns2:ProductName>
                            </ns2:ProductIdentification>
                            <ns2:BatchNumber>4421-AAA1</ns2:BatchNumber>
                            <ns2:ItemAction>Update</ns2:ItemAction>
                            <ns2:ScheduledPickupDate>0000-00-00</ns2:ScheduledPickupDate>
                            <ns2:BaseQuantity>
                                <ns2:Measurement>
                                    <ns2:MeasurementValue>40</ns2:MeasurementValue>
                                </ns2:Measurement>
                            </ns2:BaseQuantity>
                        </ns2:ProductInformation>
                    </ns2:ReturnUpdateItemDetails>
                    <ns2:ReturnUpdateItemDetails>
                        <ns2:DocumentNumber></ns2:DocumentNumber>
                        <ns2:ItemNumber>000020</ns2:ItemNumber>
                        <ns2:ProductInformation>
                            <ns2:ProductIdentification>
                                <ns2:ProductIdentifier Type="SAP">CANOLA</ns2:ProductIdentifier>
                                <ns2:ProductName>DKL27-20 RR 50#</ns2:ProductName>
                            </ns2:ProductIdentification>
                            <ns2:BatchNumber>4421-AAA2</ns2:BatchNumber>
                            <ns2:ScheduledPickupDate>0000-00-00</ns2:ScheduledPickupDate>
                            <ns2:BaseQuantity>
                                <ns2:Measurement>
                                    <ns2:MeasurementValue>80</ns2:MeasurementValue>
                                </ns2:Measurement>
                            </ns2:BaseQuantity>
                        </ns2:ProductInformation>
                    </ns2:ReturnUpdateItemDetails>
                </ns2:ReturnUpdateProperties>
            </ns2:ReturnUpdateList>
        </ns2:ReturnUpdateRequestBody>
    </ns2:ReturnUpdateRequest>
</S:Body>

代码

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:dp="http://www.datapower.com/extensions" xmlns:dpconfig="http://www.datapower.com/param/config" extension-element-prefixes="dp" exclude-result-prefixes="dp dpconfig" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mon="Monsanto:ServiceReturnDetail" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
    <xsl:output method="xml" indent="yes"/>
    <!--    <xsl:strip-space elements="*"/>-->
    <xsl:template match="/">
        <!--<dp:remove-http-request-header name="Accept"/>-->
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
            <soapenv:Header/>
            <soapenv:Body>
                <urn:YSdsaUsseedRetUpdate>
                    <IIdent>
                        <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='Header']/*[local-name()='DocumentIdentifier']"/>
                    </IIdent>
                    <ISrc>
                        <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='DealerEntity']/*[local-name()='PartnerIdentifier']/@*[local-name()='Type']"/>
                    </ISrc>
                    <ItHdr>
                        <item>
                        <xsl:if test="/soapenv:Envelope/soapenv:Body/mon:ReturnUpdateRequest/mon:ReturnUpdateRequestBody/mon:ReturnUpdateList/mon:ReturnUpdateProperties/mon:DocumentNumber != ' ' " >
                            <Yyvbeln>
                                <xsl:value-of select="*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='DocumentNumber']"/>
                            </Yyvbeln>
                            </xsl:if>
                            <YyreqType>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='DocumentNumber']"/>
                            </YyreqType>
                            <Yykunnr>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='DealerEntity']/*[local-name()='PartnerIdentifier']"/>
                            </Yykunnr>
                            <Yyzuonr>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='PurchaseOrderNumber']"/>
                            </Yyzuonr>
                            <Yystatus>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='Status']"/>
                            </Yystatus>
                            <Yybstdk>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='RequestedPickupDate']"/>
                            </Yybstdk>
                            <Yymahdt>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='DateSubmitted']"/>
                            </Yymahdt>
                            <Yyuser>
                                <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='UserId']"/>
                            </Yyuser>
                        </item>
                    </ItHdr>
                    <ItItem>
                        <xsl:for-each select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']">
                            <item>
                                <xsl:if test="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='DocumentNumber'] != ' ' " >
                            <Yyvbeln>
                                <xsl:value-of select="*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='DocumentNumber']"/>
                            </Yyvbeln>
                            </xsl:if>
                                <Yyitm>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ItemNumber']"/>
                                </Yyitm>
                                <YymatEn>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ProductInformation']/*[local-name()='ProductIdentification']/*[local-name()='ProductIdentifier']/@*[local-name()='Type']"/>
                                </YymatEn>
                                <Yymatnr>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ProductInformation']/*[local-name()='ProductIdentification']/*[local-name()='ProductIdentifier']"/>
                                </Yymatnr>
                                <Yykdmat>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ProductInformation']/*[local-name()='BatchNumber']"/>
                                </Yykdmat>
                                <Yyzmeng>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ProductInformation']/*[local-name()='BaseQuantity']/*[local-name()='Measurement']/*[local-name()='MeasurementValue']"/>
                                </Yyzmeng>
                                <Yyzieme>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ProductInformation']/*[local-name()='BaseQuantity']/*[local-name()='Measurement']/*[local-name()='UnitOfMeasureCode']"/>
                                </Yyzieme>
                                <Yyaction>
                                    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='ReturnUpdateRequestBody']/*[local-name()='ReturnUpdateList']/*[local-name()='ReturnUpdateProperties']/*[local-name()='ReturnUpdateItemDetails']/*[local-name()='ProductInformation']/*[local-name()='ItemAction']"/>
                                </Yyaction>
                            </item>
                        </xsl:for-each>
                    </ItItem>
                </urn:YSdsaUsseedRetUpdate>
            </soapenv:Body>
        </soapenv:Envelope>
    </xsl:template>
</xsl:stylesheet>

我从代码中获得的输出。

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mon="Monsanto:ServiceReturnDetail" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
    <soapenv:Header/>
    <soapenv:Body>
        <urn:YSdsaUsseedRetUpdate>
            <IIdent>0001013083-1436198976111</IIdent>
            <ISrc>SAP_ID</ISrc>
            <ItHdr>
                <item>
                    <YyreqType>0020014759</YyreqType>
                    <Yykunnr>0001013083</Yykunnr>
                    <Yyzuonr>CHG1</Yyzuonr>
                    <Yystatus>SAVED</Yystatus>
                    <Yybstdk/>
                    <Yymahdt>0000-00-00</Yymahdt>
                    <Yyuser/>
                </item>
            </ItHdr>
            <ItItem>
                <item>
                    <Yyvbeln/>
                    <Yyitm>000010</Yyitm>
                    <YymatEn>SAP</YymatEn>
                    <Yymatnr>CANOLA</Yymatnr>
                    <Yykdmat>4421-AAA1</Yykdmat>
                    <Yyzmeng>40</Yyzmeng>
                    <Yyzieme/>
                    <Yyaction>Update</Yyaction>
                </item>
                <item>
                    <Yyvbeln/>
                    <Yyitm>000010</Yyitm>
                    <YymatEn>SAP</YymatEn>
                    <Yymatnr>CANOLA</Yymatnr>
                    <Yykdmat>4421-AAA1</Yykdmat>
                    <Yyzmeng>40</Yyzmeng>
                    <Yyzieme/>
                    <Yyaction>Update</Yyaction>
                </item>
            </ItItem>
        </urn:YSdsaUsseedRetUpdate>
    </soapenv:Body>
</soapenv:Envelope>

预期的输出应该为我正在做的每个人获得更新的值<ns2:ItemNumber>000010</ns2:ItemNumber>。出于某种原因,我得到了相同的价值。

预期产出:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mon="Monsanto:ServiceReturnDetail" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
    <soapenv:Header/>
    <soapenv:Body>
        <urn:YSdsaUsseedRetUpdate>
            <IIdent>0001013083-1436198976111</IIdent>
            <ISrc>SAP_ID</ISrc>
            <ItHdr>
                <item>
                    <YyreqType>0020014759</YyreqType>
                    <Yykunnr>0001013083</Yykunnr>
                    <Yyzuonr>CHG1</Yyzuonr>
                    <Yystatus>SAVED</Yystatus>
                    <Yybstdk/>
                    <Yymahdt>0000-00-00</Yymahdt>
                    <Yyuser/>
                </item>
            </ItHdr>
            <ItItem>
                <item>
                    <Yyvbeln/>
                    <Yyitm>000010</Yyitm>
                    <YymatEn>SAP</YymatEn>
                    <Yymatnr>CANOLA</Yymatnr>
                    <Yykdmat>4421-AAA1</Yykdmat>
                    <Yyzmeng>40</Yyzmeng>
                    <Yyzieme/>
                    <Yyaction>Update</Yyaction>
                </item>
                <item>
                    <Yyvbeln/>
                    <Yyitm>000020</Yyitm>
                    <YymatEn>SAP</YymatEn>
                    <Yymatnr>CANOLA</Yymatnr>
                    <Yykdmat>4421-AAA1</Yykdmat>
                    <Yyzmeng>80</Yyzmeng>
                    <Yyzieme/>
                    <Yyaction>Update</Yyaction>
                </item>
            </ItItem>
        </urn:YSdsaUsseedRetUpdate>
    </soapenv:Body>
</soapenv:Envelope>

更新即可。感谢LarsH的建议。

YymatEn>
            <xsl:value-of select="*[local-name()='ProductIdentifier']/@*[local-name()='Type']"/>
        </YymatEn>
        <Yymatnr>
            <xsl:value-of select="*[local-name()='ProductIdentifier']"/>
        </Yymatnr>
        <Yykdmat>
            <xsl:value-of select="*[local-name()='BatchNumber']"/>
        </Yykdmat>
        <Yyzmeng>
            <xsl:value-of select="*[local-name()='MeasurementValue']"/>
        </Yyzmeng>
        <Yyzieme>
            <xsl:value-of select="*[local-name()='UnitOfMeasureCode']"/>
        </Yyzieme>
        <Yyaction>
            <xsl:value-of select="*[local-name()='ItemAction']"/>
        </Yyaction>

我已尝试过以上所有陈述,但由于某种原因,我没有得到这些值。

1 个答案:

答案 0 :(得分:3)

您遇到问题的原因是您的代码没有使用每次迭代时for-each选择的上下文。

例如,当你做

<xsl:for-each select="/*[local-name()='Envelope']/
  *[local-name()='Body']/
  *[local-name()='ReturnUpdateRequest']/
  *[local-name()='ReturnUpdateRequestBody']/
  *[local-name()='ReturnUpdateList']/
  *[local-name()='ReturnUpdateProperties']/
  *[local-name()='ReturnUpdateItemDetails']">

for-each中的代码在ReturnUpdateItemDetails元素的上下文中运行...每个选定的ReturnUpdateItemDetails元素运行一次。因此代码应该使用context元素继续:

<item>
  <xsl:if test="*[local-name()='DocumentNumber'] != ' ' " >

请注意,我删除了从根导航的XPath表达式的所有初始部分,并使用了上下文节点。如果每次都从root用户开始,那么您将选择所有与该XPath表达式匹配的DocumentNumber元素,而不是一次迭代一个。{em> all 。在某些用法中,这意味着您最终只会获得第一个的价值。

因此,您需要对for-each中的每个XPath表达式执行相同操作:删除for-each已选择的部分,并使用上下文节点。 E.g。

<Yyitm>
  <xsl:value-of select="*[local-name()='ItemNumber']"/>
</Yyitm>

关于使用XSLT还有很多话要说,因为它意味着要使用,例如使用命名空间而不是避免它们,并使用模板。但阅读XSLT教程或书籍比通过Q&amp; A更好。 (查看标记信息页面上的资源。)

更新以回应评论

同样,如果您的for-each XPath以*[local-name()='ReturnUpdateItemDetails']结尾,则每次选择ReturnUpdateItemDetails元素作为上下文节点。例如,而不是

<xsl:value-of select="*[local-name()='ProductIdentifier']/@*[local-name()='Type']"/>

您需要从ReturnUpdateItemDetails开始,例如选择其中一个孩子,ProductInformation后跟ProductIdentification,然后才能到达ProductIdentifier

<xsl:value-of select="ns2:ProductInformation/ns2:ProductIdentification/
  ns2:ProductIdentifier/@Type" />

其中ns2命名空间前缀在代码的祖先元素上声明(例如在<soapenv:Envelope>上):

<soapenv:Envelope xmlns:ns2="ibm:ServiceReturnUpdate"
   xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ...

我强烈建议在尝试通过反复试验进一步推进之前,先了解XPath和XSLT的基础知识。