2016-11-11 5 views
0

Я хочу, чтобы скопировать XML-узлы в повторяющейся структуры к другой повторяющейся структуры по позиции ... Значение первого узла собирается первого первого узла и так далее ..итерацию и захватить узлы по позиции

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap-env:Header/> 
<soap-env:Body> 
    <n0:YCaXmlPoResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style"> 
     <XmlerrorItmOut> 
      <item> 
       <YyxmlLineItem>000000</YyxmlLineItem> 
       <YyextPoItem>000001</YyextPoItem> 
       <Yylang/> 
       <YyextError>1</YyextError> 
       <YyerrorDesc>2</YyerrorDesc> 
      </item> 
      <item> 
       <YyxmlLineItem>000000</YyxmlLineItem> 
       <YyextPoItem>000002</YyextPoItem> 
       <Yylang>EN</Yylang> 
       <YyextError>3</YyextError> 
       <YyerrorDesc>4</YyerrorDesc> 
      </item> 
     </XmlerrorItmOut> 
     <Xmlitem> 
      <item> 
       <Mandt>430</Mandt> 
       <YypartnerId>1100021413304</YypartnerId> 
       <YyxmlDocid>US-COC-104492-19311128</YyxmlDocid> 
       <YypoLineItem>000001</YypoLineItem> 
      </item> 
      <item> 
       <Mandt>430</Mandt> 
       <YypartnerId>1100021413304</YypartnerId> 
       <YyxmlDocid>US-COC-104492-19311128</YyxmlDocid> 
       <YypoLineItem>000002</YypoLineItem> 
      </item> 
     </Xmlitem> 
    </n0:YCaXmlPoResponse> 
</soap-env:Body> 

в следующем strucure

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap-env:Header/> 
<soap-env:Body> 
    <n0:YCaXmlPoResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style"> 
     <XmlerrorItmOut> 
      <item> 
       <YyxmlLineItem>000000</YyxmlLineItem> 
       <YyextPoItem>000001</YyextPoItem> 
       <Yylang/> 
       <YyextError>1</YyextError> 
       <YyerrorDesc>2</YyerrorDesc> 
      </item> 
      <item> 
       <YyxmlLineItem>000000</YyxmlLineItem> 
       <YyextPoItem>000002</YyextPoItem> 
       <Yylang>EN</Yylang> 
       <YyextError>3</YyextError> 
       <YyerrorDesc>4</YyerrorDesc> 
      </item> 
     </XmlerrorItmOut> 
     <Xmlitem> 
      <item> 
       <Mandt>430</Mandt> 
       <YypartnerId>1100021413304</YypartnerId> 
       <YyxmlDocid>US-COC-104492-19311128</YyxmlDocid> 
       <YypoLineItem>000001</YypoLineItem> 
       <YyextError>1</YyextError> 
       <YyerrorDesc>2</YyerrorDesc> 
      </item> 
      <item> 
       <Mandt>430</Mandt> 
       <YypartnerId>1100021413304</YypartnerId> 
       <YyxmlDocid>US-COC-104492-19311128</YyxmlDocid> 
       <YypoLineItem>000002</YypoLineItem> 
       <YyextError>3</YyextError> 
       <YyerrorDesc>4</YyerrorDesc> 
      </item> 
     </Xmlitem> 
    </n0:YCaXmlPoResponse> 
</soap-env:Body> 

Помощь очень ценится !. .

ответ

0

Попробуйте это:

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

    <xsl:key name="error" match="XmlerrorItmOut/item" use="count(preceding-sibling::item) + 1"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Xmlitem/item"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:copy-of select="key('error', position())/YyextError"/> 
     <xsl:copy-of select="key('error', position())/YyerrorDesc"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Сначала мы создаем ключ. Мы используем счет, предшествующий родственным узлам вместо позиции. Хотя это может быть медленным, если у вас есть тысячи предметов, это работает.

identity transform копирует каждый узел «как есть».

Второй шаблон соответствует любому элементу Xmlitem/item, скопировать его содержимое и добавить элементы ошибки по ключу.

+0

Он работал как шарм! Большое спасибо Александр :) –