当我在Java中执行此操作时出现此错误:
InputStream foo = getClass().getResourceAsStream(XML_TRANSFORM);
javax.xml.transform.Transformer transformer = factory.newTransformer(new StreamSource(foo)); // error
我无法弄清楚错误的位置,因为我没有更多信息,因为XML在线验证器告诉我没有语法错误(例如:https://www.w3schools.com/xml/xml_validator.asp)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<TimeSeriesDoc>
<xsl:apply-templates select="/eai-document" />
<xsl:apply-templates select="eai-timeserie" />
</TimeSeriesDoc>
<xsl:template match="/eai-document">
<DocumentHeader>
<Identification v="{@identification}" />
<Version v="{@version}" />
<Type v="{@type}" />
<Status v="{@status}" />
<ClassificationType v="{@classification}" />
<CreationDateTime v="{@creation-date-time}" />
<ProcessType v="{@process-type}" />
<Initiator v="{@initiator}" />
<InitiatorRole v="initiator-role}" />
<Receptor v="{@receptor}" />
<ReceptorRole v="{@receptor-role}" />
<ElaborateDateTime v="{@elaborate-date-time}" />
</DocumentHeader>
</xsl:template>
<xsl:template match="eai-timeserie">
<TimeSeries>
<Identification v="{@identification}" />
<BusinessType v="{@business-type}" />
<Product v="{@product}" />
<ObjectAggregation v="{@object-agregation}" />
<AreaIdentification v="{@area-id}" />
<ResourceObject v="{@resource-object}" />
<MeasureUnit v="{@measure-unit}" />
<CurveType v="{@curve-type}" />
<xsl:apply-templates select="eai-period" />
</TimeSeries>
</xsl:template>
<xsl:template match="eai-period">
<Period>
<Resolution v="{@resolution}" />
<xsl:apply-templates select="eai-point" />
</Period>
</xsl:template>
<xsl:template match="eai-point">
<Pt>
<P v="{@position}" />
<Q v="{@quantity}" />
</Pt>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
在XSLT中有一个稍微奇怪的规则,这意味着如果你有
<x:TimeSeriesDoc>
<xsl:apply-templates select="/eai-document" />
<xsl:apply-templates select="eai-timeserie" />
</x:TimeSeriesDoc>
在样式表的顶层然后它是有效的(但是被忽略和无用),而如果你有
<TimeSeriesDoc>
<xsl:apply-templates select="/eai-document" />
<xsl:apply-templates select="eai-timeserie" />
</TimeSeriesDoc>
然后它无效(和错误)。
如果处理器没有告诉您错误的位置,那可能是因为您的Java应用程序正在将系统错误输出流发送到您没有看到它的位置。在应用程序中修复此问题,或者在从Java应用程序编译之前尝试使用oXygen等环境调试样式表。由于您的错误表明您对XSLT语言的基础知识缺乏了解,因此使用oXygen(或Stylus Studio或XML Spy)等工具进行开发将非常有用。