XSL - “无法编译样式表”错误,但语法很好

时间:2017-11-22 11:09:58

标签: java xml xslt syntax-error stylesheet

当我在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>

1 个答案:

答案 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)等工具进行开发将非常有用。