使用XSLT更快地转换此XML的方法?

时间:2016-09-20 18:54:15

标签: xml ms-access xslt

我是一个使用XSLT的完整菜鸟,我一直在寻找,我试图找到答案。下面的XSLT适用于我的小样本文件,但实际的xml文件是200 MB,我等了20分钟才取消它。我的问题是,有更快的方法吗?我的XSLT是不是马虎?我在Access中使用它,因为我别无选择。

以下是XML示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ACES version="3.0">

<App action="A" id="1">
    <BaseVehicle id="119703">2013 Acura MDX                                                                                                 </BaseVehicle>
    <EngineBase id="5816">V6 3.7L (224cid 3664cc) 3.54x3.78in/90.0x96.0mm</EngineBase>
    <FuelType id="5">GAS</FuelType>
    <Qty>1</Qty>
</App>
<App action="A" id="2">
    <BaseVehicle id="119703">2013 Acura MDX                                                                                                 </BaseVehicle>
    <EngineBase id="2147">V6 3.7L (-cid 3664cc) 3.54x3.78in/90.0x96.0mm</EngineBase>
    <FuelType id="5">GAS</FuelType>
    <Qty>1</Qty>
</App>
</ACES>

这是我正在使用的XSLT:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="//ACES/App/BaseVehicle">
    <BaseID><xsl:value-of select="@id"/></BaseID>
    <BaseName><xsl:value-of select="//ACES/App/BaseVehicle"/></BaseName>
</xsl:template>

<xsl:template match="//ACES/App/EngineBase">
    <EngineID><xsl:value-of select="@id"/></EngineID>
    <EngineName><xsl:value-of select="//ACES/App/EngineBase"/></EngineName>
</xsl:template>

<xsl:template match="//ACES/App/FuelType">
    <FuelID><xsl:value-of select="@id"/></FuelID>
    <FuelName><xsl:value-of select="//ACES/App/FuelType"/></FuelName>
</xsl:template>

</xsl:stylesheet>

我真正想要的是@ id和文本值。如下所示:

BaseID   BaseVehicle       EngineID    EngineBase

119703   2013 Acura MDX     5816       V6 3.7L (224cid 3664cc) 3.54x3.78in/90.0x96.0mm

作为第一个示例(我希望按此顺序列出所有内容)

我能以更快的方式做到这一点吗?

由于

2 个答案:

答案 0 :(得分:0)

你写的内容会尝试输出所有内容,例如BaseVehicle的文本内容,您只需要当前上下文节点之一。

我建议使用

<xsl:template match="App">
    <BaseID><xsl:value-of select="BaseVehicle/@id"/></BaseID>
    <BaseName><xsl:value-of select="BaseVehicle"/></BaseName>
    <EngineID><xsl:value-of select="EngineBase/@id"/></EngineId>
    <EngineName><xsl:value-of select="EngineBase"/></EngineName>
</xsl:template>

         

         

答案 1 :(得分:0)

它花费这么长时间的原因是,每次你点击BaseVehicle时,你都会处理文档中的每个BaseVehicle:

<xsl:template match="//ACES/App/BaseVehicle">
    <BaseID><xsl:value-of select="@id"/></BaseID>
    <BaseName><xsl:value-of select="//ACES/App/BaseVehicle"/></BaseName>
</xsl:template>

几乎可以写出:

<xsl:template match="BaseVehicle">
    <BaseID><xsl:value-of select="@id"/></BaseID>
    <BaseName><xsl:value-of select="."/></BaseName>
</xsl:template>

(实际上,如果您使用的是XSLT 1.0处理器,那么select="//ACES/App/BaseVehicle"将只输出第一个BaseVehicle的值,这可能非常快或非常慢,这取决于您的XSLT处理器的智能程度。但它并不需要多长时间,因为它会给出错误的输出。)

更正后,我希望这个样式表能在10秒内左右使用Saxon。