【问题标题】:"[xX][mM][lL]" is not allowed. - creating XSLT file within String不允许使用“[xX][mM][lL]”。 - 在字符串中创建 XSLT 文件
【发布时间】:2017-09-27 09:31:49
【问题描述】:

我知道这个论坛上有很多这样的问题,但没有一个答案能解决我的问题。

我有一个动态生成 xslt 文件的类(不要问为什么,我有很多 web 服务响应来处理,我发现 XSLT 是最快的方法,我不想为每个单独创建 xslt 文件网络服务响应)。

所以我正在使用字符串生成器在类 XSLT 编写器中创建我的 XSLT,我得到正确的输出

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text" indent="yes"/>
    <xsl:variable name="singleQ">
        <xsl:text>'</xsl:text>
    </xsl:variable>
    <xsl:variable name="doubleQ">
        <xsl:text>''</xsl:text>
    </xsl:variable>
    <xsl:template match="/">
        <file>
            <xsl:for-each select="wd:Get_Frequencies_Response/wd:Response_Data/wd:Frequency">
                <xsl:text>{'</xsl:text>
                <xsl:value-of
                    select="replace(wd:Frequency_Data/wd:Annualization_Factor, $singleQ, $doubleQ)"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of
                    select="replace(wd:Frequency_Data/wd:Frequency_Behavior_Reference, $singleQ, $doubleQ)"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of
                    select="replace(wd:Frequency_Data/wd:Frequency_ID, $singleQ, $doubleQ)"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="replace(wd:Frequency_Data/wd:Name, $singleQ, $doubleQ)"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of
                    select="replace(wd:Frequency_Data/wd:Use_Weekly_Hours, $singleQ, $doubleQ)"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of
                    select="replace(wd:Frequency_Data/wd:Used_in_Payroll_Interface, $singleQ, $doubleQ)"/>
                <xsl:text>'},</xsl:text>
            </xsl:for-each>
        </file>
    </xsl:template>
</xsl:stylesheet>

我知道这个是正确的,因为我将它粘贴到 Oxygen xml 中并格式化它,^ 这就是我得到的。 (原来 XSLT 写在 ONE 行,所以我用 Oxygen 格式化只是为了检查输出是否正常)。

然后我用这个方法来创建我的转换器:

    private Transformer createTransformer(XSLTWriter xslt) throws Exception {
    Transformer transformer = null;
    TransformerFactory tf = TransformerFactory.newInstance();
    Source s = new StreamSource(new StringReader(xslt.getXSLT()));
    transformer = tf.newTransformer(s);
    return transformer;
}

我在上面粘贴的 XSLT 出现错误:

    11:16:24,432 ERROR [stderr] (Get Frequencies) Error on line 1 column 1276
11:16:24,433 ERROR [stderr] (Get Frequencies)   SXXP0003: Error reported by XML parser: The processing instruction target matching
11:16:24,434 ERROR [stderr] (Get Frequencies)   "[xX][mM][lL]" is not allowed.
11:16:24,435 ERROR [stderr] (Get Frequencies) javax.xml.transform.TransformerConfigurationException: Failed to compile stylesheet. 1 error detected.
11:16:24,436 ERROR [stderr] (Get Frequencies)   at net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:140)
11:16:24,437 ERROR [stderr] (Get Frequencies)   at net.sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:135)
11:16:24,438 ERROR [stderr] (Get Frequencies)   at net.sf.saxon.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:86)
11:16:24,439 ERROR [stderr] (Get Frequencies)   at __redirected.__TransformerFactory.newTransformer(__TransformerFactory.java:132)
11:16:24,440 ERROR [stderr] (Get Frequencies)   at config.loader.ConfigLoader.createTransformer(ConfigLoader.java:235)
11:16:24,440 ERROR [stderr] (Get Frequencies)   at config.loader.ConfigLoader.run(ConfigLoader.java:102)
11:16:24,442 ERROR [stderr] (Get Frequencies)   at java.lang.Thread.run(Thread.java:748)

有人做过吗?

【问题讨论】:

  • 在哪个地方报错?错误信息是指未格式化的 XSLT,XSLT 已格式化。
  • 所以我应该添加 \n 吗?到每一行?
  • 要么这样,要么只写在格式化字符串中的位置是在未格式化字符串中的第 1276 列找到的文本。
  • 顺便说一句。无论如何,您粘贴的 XSLT 并不完整。你至少错过了结束xsl:stylesheet标签
  • 没有第 1276 列,当我将 XSLT 复制到记事本++ 中时,我只有 1271 列,.trim() 没有帮助

标签: java xml xslt saxon


【解决方案1】:

错误消息清楚地表明,在您提供的源样式表的位置 1276 处存在 &lt;?xml ....?&gt; 形式的处理指令(或 XML 声明)。这是不允许的(如果是 XML 声明,则必须在开头,如果是处理指令,则不得将其称为“xml”)。

现在您显示的输入不包含此内容,因此我们必须得出结论,您向我们显示的输入不是您实际处理的输入。

您显示的输入不包含xsl:stylesheet 元素的结束标记这一事实可能是一个线索。

【讨论】:

  • 非常感谢撒克逊人。 :-) 但我认为你在这里错了。如果您关注 cmets,您会看到没有位置 1276。我的假设是否正确,只是缺少结束 stylesheet 标记并且错误消息只是误导?
  • 就像在上面的评论中一样,我不小心粘贴了它,编辑后 - 每个标签都在那里,xml 声明在那里。没有位置 1276 因为整个字符串有 1271 长度/列
  • @mat_zat 什么是“你的整个字符串”?您显示的是 XSLT 文件,而不是字符串。显示并因此无偏见地观察未修改的代码,在我们向您指出之前,您会发现问题。
  • @kumesana 字符串作为没有缩进的 xslt 代码
  • @Vampire 一切皆有可能,但如果没有&lt;?xml 且没有位置 1276,Xerces 似乎不太可能在位置 1276 报告&lt;?xml 的问题。我的下一个诊断将是System.err.println(xslt.getXSLT()) 或者System.err.println(xslt.getXSLT().substring(1250))
猜你喜欢
  • 2019-10-24
  • 2011-12-17
  • 2013-11-22
  • 2017-03-22
相关资源
最近更新 更多