我真的在努力改造一些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>
答案 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以了解上述模板的工作原理。