2017-03-21 19 views
1

私は実際にXMLを変換するのに苦労しています。私は通常、XSLTでは問題ないが、XMLの問題を引き起こすルート要素である可能性があります。私は本当にいくつかの指導を感謝します。XSLTを使用したXMLからXMLへの変換

既存のXML:

<Cars> 
    <Record> 
    <Make>Volkswagen</Make> 
    <Service>20000 KM</Service> 
    <Model>Golf</Model> 
    <Speed>190 KPH</Speed> 
    <Engine>1400 CC</Engine> 
    <Type>Diesel</Type> 
    <Colour>Black</Colour> 
    <Doors>3</Doors> 
</Record> 
<Record> 
    <Make>Ford</Make> 
    <Service>15000 KM</Service> 
    <Model>Fiesta</Model> 
    <Speed>180 KPH</Speed> 
    <Engine>1400 CC</Engine> 
    <Type>Petrol</Type> 
    <Colour>Red</Colour> 
    <Doors>5</Doors> 
</Record> 
</Cars> 

マイXSLT:

<?xml version="1.0" ?> 
<asx:abap xmlns:asx="http://www.testsrvXXXX.com/abdxml" version="1.0"> 
<asx:values> 

<META> 

<XOUTPUT> 
    <FIELDNAME>Make</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>CHAR</TYPE> 
    <SRC_TEXT>Make</SRC_TEXT> 
</XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Model</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>CHAR</TYPE> 
    <SRC_TEXT>Car Model</SRC_TEXT> 
<XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Engine</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>CHAR</TYPE> 
    <SRC_TEXT>Engine Size</SRC_TEXT> 
</XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Type</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>CHAR</TYPE> 
    <SRC_TEXT>Fuel Type</SRC_TEXT> 
</XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Colour</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>CHAR</TYPE> 
    <SRC_TEXT>Paint Colour</SRC_TEXT> 
</XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Doors</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>NUM</TYPE> 
    <SRC_TEXT>Door Count</SRC_TEXT> 
</XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Speed</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>NUM</TYPE> 
    <SRC_TEXT>Top Speed</SRC_TEXT> 
</XOUTPUT> 

<XOUTPUT> 
    <FIELDNAME>Service</FIELDNAME> 
    <OUTPUTLEN>000130</OUTPUTLEN> 
    <TYPE>CHAR</TYPE> 
    <SRC_TEXT>Service Intervals</SRC_TEXT> 
</XOUTPUT> 

</META> 

<Y_OUTPUT> 
<item> 
    <Make>Volkswagen</Make> 
    <Service>20000 KM</Service> 
    <Model>Golf</Model> 
    <Speed>190 KPH</Speed> 
    <Engine>1400 CC</Engine> 
    <Type>Diesel</Type> 
    <Colour>Black</Colour> 
    <Doors>3</Doors> 
</item> 
<item> 
    <Make>Ford</Make> 
    <Service>15000 KM</Service> 
    <Model>Fiesta</Model> 
    <Speed>180 KPH</Speed> 
    <Engine>1400 CC</Engine> 
    <Type>Petrol</Type> 
    <Colour>Red</Colour> 
    <Doors>5</Doors> 
</item> 
</Y_OUTPUT> 
</asx:values> 
</asx:abap> 

変換されたXMLが見えるように必要

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<xsl:for-each select="Y_OUTPUT/ITEM"> 
<Cars> 
     <Record> 
      <Make><xsl:value-of select="Make"/></Make> 
      <Service><xsl:value-of select="Service"/></Service> 
      <Model><xsl:value-of select="Model"/></Model> 
      <Speed><xsl:value-of select="Speed"/></Speed> 
      <Engine><xsl:value-of select="Engine"/></Engine> 
      <Type><xsl:value-of select="Type"/></Type> 
      <Colour><xsl:value-of select="Colour"/></Colour> 
      <Doors><xsl:value-of select="Doors"/></Doors> 
     </Record> 
</Cars> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

2つのものを修正した後、最初の2番目のXOUTPUTタグが正しく閉じられません( '/'は終了タグから抜けています)。次に、xsltでは、for-eachの選択を「// Y_OUTPUT/item」に変更しました。 –

答えて

0

私はこの問題は、あなたの中に/と一致していることだと思いますテンプレートを入力してからxsl:for-eachを選択してY_OUTPUTおよびY_OUTPUTはXML入力のルート要素ではありません。

xsl:for-eachを更新して、テンプレートの一致箇所(現在のコンテキスト)を開始することができます。

また、代替xsl:apply-templatesを使用することです

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
    <Cars> 
     <xsl:for-each select="*/Y_OUTPUT/item"> 
     <Record> 
      <xsl:for-each select="*"> 
      <xsl:element name="{local-name()}"> 
       <xsl:value-of select="."/> 
      </xsl:element> 
      </xsl:for-each> 
     </Record> 
     </xsl:for-each> 
    </Cars>  
    </xsl:template> 

</xsl:stylesheet> 

...名前空間宣言せずに子要素の作成を処理するために、第2 xsl:for-eachを追加することができます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
    <Cars> 
     <xsl:apply-templates select="*/Y_OUTPUT/item"/> 
    </Cars>  
    </xsl:template> 

    <xsl:template match="item"> 
    <Record> 
     <xsl:apply-templates/> 
    </Record> 
    </xsl:template> 

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

</xsl:stylesheet> 

それは完全に上記のテンプレートが機能している方法を知ってXSLTs built-in template rulesを理解するのに役立ちます...それはさらにいくつかのラインだが、より複雑な変換を作成する際に良好なパターン(プッシュ)を使用します。

+1

Danielさん、ありがとうございました! – Collider74

関連する問題