【问题标题】:XSLT Transformation Error in WSO2 ESB 4.8.1WSO2 ESB 4.8.1 中的 XSLT 转换错误
【发布时间】:2015-03-01 08:17:22
【问题描述】:

我正在简单代理服务中对传入的 Soap/http 请求执行 XSLT 转换。我收到以下错误。

注意: 我正在使用 WSO2 ESB 4.8.1。

错误:

Unable to perform XSLT transformation using : Value {name ='null', keyValue ='gov:/xslt/Interface.xslt'} against source XPath : s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1] reason : Unable to create an OMElement using XSLT result  {org.apache.synapse.mediators.transform.XSLTMediator}
org.apache.synapse.SynapseException: Unable to create an OMElement using XSLT result 
    at org.apache.synapse.mediators.transform.XSLTMediator.performXSLT(XSLTMediator.java:302)
    at org.apache.synapse.mediators.transform.XSLTMediator.mediate(XSLTMediator.java:191)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
    at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:166)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:411)
    at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[4,16]
Message: Content is not allowed in prolog.
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
    at org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:109)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:570)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:566)
    at org.apache.synapse.util.jaxp.StreamResultBuilder.getNode(StreamResultBuilder.java:87)
    at org.apache.synapse.mediators.transform.XSLTMediator.performXSLT(XSLTMediator.java:300)
    ... 12 more
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[4,16]
Message: Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598)
    at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
    at org.apache.axiom.util.stax.dialect.SJSXPStreamReaderWrapper.next(SJSXPStreamReaderWrapper.java:138)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
    ... 17 more

XSLT 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:con="http://com.example/cdm/contract/v1" xmlns:lic="http://com.example/cdm/license/v1" xmlns:org="http://com.example/cdm/organization/v1" xmlns:tns="http://com.example/cdm/order/v1" xmlns:tns1="http://com.example/cdm/customer/v1" xmlns:tns3="http://com.example/cdm/address/v1" xmlns:tns4="http://com.example/cdm/person/v1" xmlns:tns5="http://com.example/cdm/productoffer/v1" xmlns:tns6="http://com.example/cdm/product/v1" xmlns:tns7="http://com.example/cdm/productofferprice/v1" exclude-result-prefixes="tns tns1 tns4 tns3 tns5 tns6 tns7" version="1.0">
  <xsl:template match="/tns:OrderRequest">
    <tns:OrderRequest>
      <tns:Order>
        <tns:OrderHeader>
          <tns:OrderNumber>
            <xsl:value-of select="tns:OrderHeader/tns:OrderNumber" />
          </tns:OrderNumber>
            </tns:OrderHeader>
         </tns:Order>
    </tns:OrderRequest>
  </xsl:template>
</xsl:stylesheet>

问题: 我不知道我的 XSLT 文件有什么问题。我的序言中没有看到任何内容。

【问题讨论】:

  • 您在此处缺少&lt;tns:Order&gt; 的结束标记
  • XSLT 已成功执行,只是 XSLT 的输出不是有效的 XML。您能否也分享您的输入 XML,这将有助于解决问题。

标签: xml xslt wso2 xslt-1.0 wso2esb


【解决方案1】:

错误表示转换的结果在根元素之前有非空白文本。对此的唯一解释是您的模板永远不会被触发,并且只应用默认模板(复制文本节点,而不是元素)。这意味着转换输入的根元素不是tns:OrderRequest

【讨论】:

  • 谢谢!我一直在寻找一个好的解决方案。我使用了&lt;messageBuilder class="org.apache.axis2.format.PlainTextBuilder" contentType="text/html" /&gt; btw,这样 html 在日志中的可读性会更高。
【解决方案2】:

看起来您的配置和请求负载与此错误有关。请提供您的代理服务配置并输入 xml 有效负载,以便为您提供更多见解。

【讨论】:

    【解决方案3】:

    如果您在错误中收到“无法使用 XSLT 结果创建 OMElement”,则表示您的模板/命名空间在 xslt 中与请求消息不匹配。请查看开发人员评论 here

    【讨论】:

      【解决方案4】:

      此错误通常预期有效负载未形成以由 XSLT 处理。一旦你得到这个错误,所有传入的payload都无法处理是否是正确的payload。

      解决方案: 更改本地条目和代理服务文件中的键值后重新启动 wso2esb。

      永久解决方案: 编写自定义 XSLT Mediator 来解决这个问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 2014-06-16
        • 1970-01-01
        • 2016-04-27
        • 2015-03-15
        相关资源
        最近更新 更多