camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Łukasz Dywicki <l...@code-house.org>
Subject Re: Splitting on XML Documents
Date Fri, 27 Jan 2012 13:51:28 GMT
Hey Chris,
Let me try to explain what happens under the hood.

XSLT transformation requires an instance of javax.xml.transform.Source [1]. The result from
the splitter is a org.w3c.dom.Node (or something similar). By default your node will be wrapped
in DOMSource [2]. The explicit type conversion lets XSLT work with a Document instead of Node.
Seems that xslt processor handles differently a Document instances and Node instances, but
I don't know why.

I guess that org.w3c.dom.Document is not supported as result type in XPathExpression [3] which
is used for evaluation. Camel checks only if result can be assigned to org.w3c.dom.Node. 

Best regards,
Łukasz Dywicki
--
Code-House
http://code-house.org

[1] https://github.com/apache/camel/blob/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java#L409
[2] https://github.com/apache/camel/blob/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java#L266
[3] http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/xpath/XPathExpression.html

Wiadomość napisana przez Chris Geer w dniu 2012-01-26, o godz. 21:40:

> Thank you guys. I added the converyBodyTo command instead of my crazy
> setBody command and it seemed to work. I did have to change the attribute
> to type vs javaType though.
> 
> I wish I could explain why that was needed though. It seems odd that split
> would change the data into something not compatible with xslt. I even tried
> setting the resultType attribute on the split/xpath to org.w3c.dom.Document
> and it didn't help.
> 
> Chris
> 
> On Thu, Jan 26, 2012 at 8:12 AM, Doug Douglass <douglass.doug@gmail.com>wrote:
> 
>> Excellent suggestion Łukasz!
>> 
>> Chris, have a look at
>> http://camel.apache.org/xslt.html#XSLT-NotesonusingXSLTandJavaVersions,
>> perhaps that will resolve your issue. For my quick unit test I'm using
>> openjdk 1.6.0_22 (ArchLinux-6.b22_1.10.5-1-x86_64) and xalan 2.6.0 was
>> already in my projects dependencies/classpath.
>> 
>> Doug
>> 
>> 
>> 2012/1/26 Łukasz Dywicki <luke@code-house.org>
>> 
>>> I think you should not have any problems, the conversion is really
>> simple.
>>> After split statement you have a Node as body. For XSLT you need a
>> Source.
>>> Try adding this instead setBody
>>> 
>>> <camel:convertBodyTo javaType="org.w3c.dom.Document" />
>>> 
>>> That should force conversion to document object and I belive fix your
>>> problem.
>>> 
>>> Best regards,
>>> Łukasz Dywicki
>>> --
>>> Code-House
>>> http://code-house.org
>>> 
>>> 
>>> Wiadomość napisana przez Chris Geer w dniu 2012-01-26, o godz. 01:36:
>>> 
>>>> Doug,
>>>> 
>>>> It doesn't make much sense to me either but I do know that with the
>>> setBody
>>>> command everything works and without it, it fails. If I run the XSLT
>>>> against the same XML (save the XML to a file from the flow after the
>>> split)
>>>> in netbeans it works fine without the <?xml...?> but in camel it fails.
>>>> 
>>>> Could the split be converting the output to a string? That would
>> explain
>>>> the problem.
>>>> 
>>>> Chris
>>>> 
>>>> On Wed, Jan 25, 2012 at 5:03 PM, Doug Douglass <
>> douglass.doug@gmail.com
>>>> wrote:
>>>> 
>>>>> Chris,
>>>>> 
>>>>> I think the xml processing "fix" you've got there is a bit of
>>> red-herring.
>>>>> 
>>>>> The xml processing instruction should only be necessary if you are
>>>>> converting the output of the xpath to a String prior to the xslt
>>> endpoint,
>>>>> whether directly or indirectly. Without any explicit conversion, the
>>> output
>>>>> of the xpath will be a Node object (DeferredElementNSImpl in my test),
>>>>> which is converted to a Source via camel's built-in type conversion.
>>>>> 
>>>>> I just set up a quick unit test with a route very similar to yours and
>>>>> everything worked as I expected. Granted this test was in an existing
>>>>> project using camel 2.7.3 (time to upgrade!).
>>>>> 
>>>>> I suspect you're either running into a namespace problem[1] or your
>>>>> templates XPaths aren't expecting Parcel (from your example) as the
>> root
>>>>> element.
>>>>> 
>>>>> [1]
>>>>> 
>>> http://camel.apache.org/xpath.html#XPath-Namespaceauditingtoaiddebugging
>>>>> 
>>>>> Let us know more info (example XML and XSLT) if my suspicions are off
>>> base.
>>>>> 
>>>>> HTH,
>>>>> Doug
>>>>> 
>>>>> On Wed, Jan 25, 2012 at 3:35 PM, Chris Geer <chris@cxtsoftware.com>
>>> wrote:
>>>>> 
>>>>>> Sorry, 2.8.3.
>>>>>> 
>>>>>> On Wed, Jan 25, 2012 at 3:29 PM, Babak Vahdat
>>>>>> <babak.vahdat@swissonline.ch>wrote:
>>>>>> 
>>>>>>> And what about the Camel version you use?
>>>>>>> 
>>>>>>> Babak
>>>>>>> 
>>>>>>> --
>>>>>>> View this message in context:
>>>>>>> 
>>>>>> 
>>>>> 
>>> 
>> http://camel.465427.n5.nabble.com/Splitting-on-XML-Documents-tp5431032p5431531.html
>>>>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>>>> 
>>>>>> 
>>>>> 
>>> 
>>> 
>> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message