gpt4 book ai didi

xslt - xsl 每个不使用 XSLT 1.0 更新所有值

转载 作者:行者123 更新时间:2023-12-02 11:46:27 30 4
gpt4 key购买 nike

我有一个要求,必须根据某些 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>

我已经尝试了上述所有语句,但由于某种原因我没有得到这些值。

最佳答案

您看到问题的原因是您的代码没有使用每次迭代时 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元素。因此该代码应该使用上下文元素来继续:

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

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

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

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

关于使用 XSLT 有很多话要说,因为它就是用来使用的,例如使用命名空间而不是避免它们,并使用模板。但是,通过阅读 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 的基础知识,然后再尝试通过反复试验进一步推进。

关于xslt - xsl 每个不使用 XSLT 1.0 更新所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31253972/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com