我是一个使用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
作为第一个示例(我希望按此顺序列出所有内容)
我能以更快的方式做到这一点吗?
由于
答案 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。