Возникли затруднения в циклическом применении partNumber XSLT, как показано ниже - PullRequest
1 голос
/ 10 апреля 2019

Образец входного XML-кода SOAP, приведенный ниже:

<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: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:Description>PAD SET, RR.</b:Description>                            
                            <b:PartNumber>31500SB2100M</b:PartNumber>
                            <b:PartNumberFormatted>31500-SB2-100M</b:PartNumberFormatted> 
                        </a:Attributes>                 
                      </a:CustomerPart>
                      <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:Description>Kite  SET, RR.</b:Description>                           
                            <b:PartNumber>60211T7J305ZZ</b:PartNumber>                            
                        </a:Attributes> 
                       </a:CustomerPart>
                  </PullCustomerPartsPricingResult>
               </PullCustomerPartsPricingResponse>
             </s:Body>
  </s:Envelope>

Применяемый код XSLT Показано ниже:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output method="xml" indent="yes" />

<xsl:template match="/">
    <root xmlns="http://www.dataprint.com/global/3.0/rest/">
       <xsl:for-each  select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='PullCustomerPartsPricingResponse']/*[local-name()='PullCustomerPartsPricingResult']/*[local-name()='CustomerPart']">

                    <partDetail>    
                      <partNumber>
                                <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']" />
                       </partNumber>        
                      <partDescription>
                         <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='PullCustomerPartsPricingResponse']/*[local-name()='PullCustomerPartsPricingResult']/*[local-name()='CustomerPart']/*[local-name()='Attributes'] /*[local-name()='Description']" />
                      </partDescription>
                    </partDetail>
       </xsl:for-each>
     </root>

</xsl:template>
</xsl:stylesheet> 

Мой текущий пример вывода Показан ниже:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.dataprint.com/global/3.0/rest/">
   <results>
      <partDetail>
         <partNumber>31500SB2100M</partNumber>
         <partDescription>PAD SET, RR.</partDescription>
      </partDetail>
   </results>
   <results>
      <partDetail>
         <partNumber>31500SB2100M</partNumber>
         <partDescription>PAD SET, RR.</partDescription>
      </partDetail>
   </results>
</root>

Мой желаемый вывод показан ниже:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.dataprint.com/global/3.0/rest/">
   <results>         
      <partDetail>
         <partNumber>31500SB2100M</partNumber>
         <partDescription>PAD SET, RR.</partDescription>
      </partDetail>
   </results>
   <results>
      <partDetail>
         <partNumber>60211T7J305ZZ</partNumber>
         <partDescription>Kite  SET, RR.</partDescription>
      </partDetail>
   </results>
</root>

Я пытаюсь зациклить элемент "a: CustomerPart" для вывода PartNumber и b: Descriptionas Вывод, но сначала a: Данные CustomerPart повторяются дважды. Я понимаю, что тамТребуется ли изменение кода, пожалуйста, помогите.Eiríkr Útlendi высоко ценит ваше терпение / предложения

1 Ответ

1 голос
/ 16 апреля 2019

Внутри xsl:for-each выбранный элемент CustomerPart становится элементом контекста.Затем вы должны выбрать потомков / потомков этого CustomerPart, используя относительный путь, начинающийся с этого элемента контекста, а не абсолютный путь, начинающийся с корня документа (/).

То есть вы должнызаменить

    <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:value-of select="*[local-name()='Attributes'] /*[local-name()='PartNumber']" />

или лучше на

<xsl:value-of select="*:Attributes/*:PartNumber" />
...