访问属性值(Xpath)XSLT困难

时间:2019-01-31 09:33:40

标签: xslt xpath ibm-datapower

我无法在xpath下方访问属性标签下的PartNumber / Description值,但下面给出了soap xml。让我知道所需的更多详细信息。

请对此提供帮助。谢谢!!

正在使用的Xpath和SOAP XML消息:

<xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='PullCustomerPartsPricingResponse']/*[local-name()='PullCustomerPartsPricingResult']/*[local-name()='CustomerPart']/@*[local-name()='PartNumber']"/> 


<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <s:Header />
   <s:Body>
      <PullCustomerPartsPricingResponse xmlns="http://cdx.dealerbuilt.com/Api/0.99/">
         <PullCustomerPartsPricingResult xmlns:a="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:CustomerPart>
               <a:Placement>
                  <a:GroupId>10</a:GroupId>
               </a:Placement>
               <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/DealerBuilt.Models.Parts">
                  <b:AddedDate>2017-12-19T00:00:00</b:AddedDate>
                  <b:DealerPartId>287925</b:DealerPartId>
                  <b:Description>BAT (51/500AMP85)</b:Description>
                  <b:PartNumber>31500SB2yy1M</b:PartNumber>
                  <b:QuantityLostMonthToDate>0</b:QuantityLostMonthToDate>
               </a:Attributes>
               <a:PartKey>GZ287925</a:PartKey>
               <a:CustomerListPrice xmlns:b="http://schemas.datacontract.org/2004/07/DealerBuilt.Models">
                  <b:Amount>130.49</b:Amount>
                  <b:Currency>UsDollar</b:Currency>
               </a:CustomerListPrice>
            </a:CustomerPart>
         </PullCustomerPartsPricingResult>
      </PullCustomerPartsPricingResponse>
   </s:Body>
</s:Envelope>

问候 瓦尔丹

2 个答案:

答案 0 :(得分:0)

您已经以此结束了xpath的长表达。

/@*[local-name()='PartNumber']

但是PartNumber不是属性。这是一个名为PartNumber的元素,它是恰好名为Attributes的元素的子元素,但实际上并没有使其成为XML术语的属性!

应该看起来像这样...

<xsl:value-of select="/*[local-name()='Envelope']
                        /*[local-name()='Body']
                        /*[local-name()='PullCustomerPartsPricingResponse']
                        /*[local-name()='PullCustomerPartsPricingResult']
                        /*[local-name()='CustomerPart']
                        /*[local-name()='Attributes']
                        /*[local-name()='PartNumber']"/> 

尽管最好在XSLT中声明名称空间,然后在xpath中使用该名称空间。

答案 1 :(得分:0)

请求XML中的名称空间也需要在xslt中使用。在xsl之后给出PartNumber值。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:a="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/DealerBuilt.Models.Parts">
    <xsl:output method="xml" version="1.0"/>
    <xsl:template match="/">
        <xsl:value-of select="*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='PullCustomerPartsPricingResponse']/*[local-name()='PullCustomerPartsPricingResult']/*[local-name()='CustomerPart']/*[local-name()='Attributes']/*[local-name()='PartNumber']"/>
    </xsl:template>
</xsl:stylesheet>