2013-05-05 11 views
1

Мне нужно преобразовать XML из одной структуры в другую. Я не знаю, как это сделать. Первый xml действительно не похож на главную деталь, но в результате нужно выглядеть как мачта.XSL Transformation - Основная деталь

<?xml version = '1.0' encoding = 'UTF-8'?> 
    <Root-Element xmlns="http://example.com/ReadProductB"> 
     <RECORD1> 
      <C2>QGGG9.A1-1</C2> 
     </RECORD1> 
     <RECORD2> 
      <C2>xflowcode</C2> 
      <C3>FL1</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xtilo</C2> 
      <C3>1234</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xwat</C2> 
      <C3>75</C3> 
     </RECORD2> 
     <RECORD1> 
      <C2>QGGG9.A1-2</C2> 
     </RECORD1> 
     <RECORD2> 
      <C2>xflowcode</C2> 
      <C3>FL1</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xtilo</C2> 
      <C3>1234</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xwat</C2> 
      <C3>75</C3> 
     </RECORD2> 
    </Root-Element> 

Это результат, который я хочу.

<?xml version = '1.0' encoding = 'UTF-8'?> 
    <ns0:ProductCollection xmlns:ns0="http://example.com/ReadProductBB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <ns0:RECORD1> 
      <ns0:C2>QGGG9.A1-1</ns0:C2> 
      <ns0:RECORD2Collection> 
      <ns0:RECORD2> 
       <ns0:C2>xflowcode</ns0:C2> 
       <ns0:C3>FL1</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xtilo</ns0:C2> 
       <ns0:C3>1234</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xwat</ns0:C2> 
       <ns0:C3>75</ns0:C3> 
      </ns0:RECORD2> 
      </ns0:RECORD2Collection> 
     </ns0:RECORD1> 
     <ns0:RECORD1> 
      <ns0:C2>QGGG9.A1-2</ns0:C2> 
      <ns0:RECORD2Collection> 
      <ns0:RECORD2> 
       <ns0:C2>xflowcode</ns0:C2> 
       <ns0:C3>FL1</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xtilo</ns0:C2> 
       <ns0:C3>1234</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xwat</ns0:C2> 
       <ns0:C3>75</ns0:C3> 
      </ns0:RECORD2> 
      </ns0:RECORD2Collection> 
     </ns0:RECORD1> 
    </ns0:ProductCollection> 

Просьба помочь. Благодаря

ответ

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:b="http://example.com/ReadProductB" 
    xmlns:bb="http://example.com/ReadProductBB" 
    version="1.0"> 
    <xsl:output indent="yes"/> 

    <!-- 
     identity template 
     https://en.wikipedia.org/wiki/Identity_transform 
    --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- 
     converts elements from the namespace "http://example.com/ReadProductB" 
     to "http://example.com/ReadProductBB" 
    --> 
    <xsl:template match="b:*"> 
     <xsl:element name="bb:{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="b:Root-Element"> 
     <!--Convert b:Root-Element into bb:ProductCollection--> 
     <bb:ProductCollection> 
      <!--and then "push" only the b:RECORD1 elements --> 
      <xsl:apply-templates select="b:RECORD1"/> 
     </bb:ProductCollection> 
    </xsl:template> 

    <xsl:template match="b:RECORD1"> 
     <!--Convert the RECORD1 to new namespace --> 
     <bb:RECORD1> 
      <!-- "push" it's children 
      (which will match the generic templates above)--> 
      <xsl:apply-templates select="@*|node()"/> 
      <bb:RECORD2Collection> 
       <!--and "push" the RECORD2 elements that are 
       between this RECORD1 element and the next(or the end) --> 
       <xsl:apply-templates select="following-sibling::b:RECORD2 
         [generate-id(preceding-sibling::b:RECORD1[1]) 
         = generate-id(current())]" /> 
      </bb:RECORD2Collection> 
     </bb:RECORD1> 
    </xsl:template> 

</xsl:stylesheet> 
+1

Извинения. Я немного расплывчался в вопросе. Я новичок во всем этом, поэтому не понял, как правильно сформировать свой вопрос. В следующий раз я постараюсь усерднее. – user2351802

+0

С этой проблемой я боролся в течение нескольких дней, и вы, ребята, придумали решение/предложение в кратчайшие сроки. Престижность к вам. Очень ценю вашу помощь. На самом деле у меня есть xsd для полученного xml, который я хочу. Я дам ему попробовать с вашим предложением завтра и вернуться. Немного поздно ночью прямо сейчас. – user2351802

+0

Я понял, что я проигнорировал включение в вывод '', внеся обновление моего ответа. –

1

Эта таблица стилей использует шаблон общего назначения, чтобы переместить оригинальные элементы в тех же имени в пространстве имен ns0.

В RECORD2 элементах соединены с их соответствующими RECORD1 элемента, используя generate-id для идентификации текущего RECORD1, а затем обрабатывать все следующие RECORD2 элементов, первый предшествующие RECORD1 элемента имеет тот же идентификатор.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:src="http://example.com/ReadProductB" 
    xmlns:ns0="http://example.com/ReadProductBB" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="src" 
    version="1.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 

    <xsl:template match="/src:Root-Element"> 
     <ns0:ProductCollection> 
      <xsl:apply-templates select="src:RECORD1"/> 
     </ns0:ProductCollection> 
    </xsl:template> 

    <xsl:template match="src:RECORD1"> 
     <ns0:RECORD1> 
      <xsl:apply-templates/> 
      <xsl:variable name="record1" select="generate-id()"/> 
      <ns0:RECORD2Collection> 
       <xsl:for-each select="following-sibling::src:RECORD2"> 
        <xsl:if test="generate-id(preceding-sibling::src:RECORD1[1]) = $record1"> 
         <xsl:apply-templates select="."/> 
        </xsl:if> 
       </xsl:for-each> 
      </ns0:RECORD2Collection> 
     </ns0:RECORD1> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="ns0:{local-name(current())}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

выходные

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:ProductCollection xmlns:ns0="http://example.com/ReadProductBB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:RECORD1> 
     <ns0:C2>QGGG9.A1-1</ns0:C2> 
     <ns0:RECORD2Collection> 
     <ns0:RECORD2> 
      <ns0:C2>xflowcode</ns0:C2> 
      <ns0:C3>FL1</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xtilo</ns0:C2> 
      <ns0:C3>1234</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xwat</ns0:C2> 
      <ns0:C3>75</ns0:C3> 
     </ns0:RECORD2> 
     </ns0:RECORD2Collection> 
    </ns0:RECORD1> 
    <ns0:RECORD1> 
     <ns0:C2>QGGG9.A1-2</ns0:C2> 
     <ns0:RECORD2Collection> 
     <ns0:RECORD2> 
      <ns0:C2>xflowcode</ns0:C2> 
      <ns0:C3>FL1</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xtilo</ns0:C2> 
      <ns0:C3>1234</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xwat</ns0:C2> 
      <ns0:C3>75</ns0:C3> 
     </ns0:RECORD2> 
     </ns0:RECORD2Collection> 
    </ns0:RECORD1> 
</ns0:ProductCollection> 
+0

Большое спасибо. Очень ценю много. Ваше время отклика - ошеломляющее. Я дам ему попытку вашего решения и скоро вернусь к вам. У меня есть xsd для полученного xml, который я должен был разместить. Я только новичок во всех этих извинениях. – user2351802

+0

Поскольку вы, ребята, настолько хороши, можете ли вы, пожалуйста, дать мне предложение, какой лучший способ узнать все это. Я знаю, что опыт имеет большое значение, но как начать хорошо. Существуют ли онлайн-курсы? Еще раз спасибо. – user2351802

+0

XSLT работает на самых плохо документированных языках, с которыми я столкнулся. [Спецификация] (http://www.w3.org/TR/xslt) довольно непроницаема, и большинство учебников являются поверхностными, а [W3Schools] (http://www.w3schools.com/xsl/) один из лучших. Интересно, почему вы удалили свое согласие с моим ответом. Есть ли проблема с этим? – Borodin