我有一个要求,我必须根据某个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>
我已尝试过以上所有陈述,但由于某种原因,我没有得到这些值。
答案 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更好。 (查看xslt标记信息页面上的资源。)
同样,如果您的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的基础知识。