通过XSLT将XML转换为XML

时间:2017-03-21 15:10:29

标签: xml xslt

我真的在努力改造一些XML。我通常可以使用XSLT,但它可能是导致我在XML中出现问题的根元素。我真的很感激一些指导。

现有XML:

<?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需要如下所示:

<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" 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>

1 个答案:

答案 0 :(得分:0)

我认为问题是您在模板中匹配xsl:for-each,但是然后使用Y_OUTPUT开始Y_OUTPUT选择而xsl:for-each不是根元素在您的XML输入中。

您可以更新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: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> 来处理没有名称空间声明的子元素的创建...

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: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>

它还有更多的线条,但在创建更复杂的变换时需要使用一个好的模式(推送)......

inHouseBtn.setOnAction(inHouseSpecificEvent ->
{ 
    grid1.getChildren().removeAll(machineIDLabel, companyLabel, machineIDField, companyNameField);

    grid1.add(machineIDLabel,0,8,1,1);
    grid1.add(machineIDField, 1,8,1,1);
});


outSourceBtn.setOnAction(outSourceSpecificEvent ->
{
    grid1.getChildren().removeAll(machineIDLabel, companyLabel, machineIDField, companyNameField);

    grid1.add(companyLabel,0,8,1,1);
    grid1.add(companyNameField,1,8,1,1);
});

有助于完全理解XSLTs built-in template rules以了解上述模板的工作原理。