You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-users@xalan.apache.org by sh...@e-z.net on 2011/11/08 02:39:16 UTC

Re: Need to copy all elements of a parent element using xalan c++ (1.10)

> Hi,
>  
> I need to copy all the child elements from the parent element to output
> xml using xalan c++  transform method. However, one of the child element
> is prefixed but does not have corresponding namespace.
>  
> What should I do in xslt so that all the children elements of parent
> element are copied to output xml file without caring the namespace. Altova
> XMLSpy does that but When I use xalan c++ 1.10 , it does not copy. 
>  
> How I can achieve this using xalan c++  1.10 ?
>  
> E.g.
> Input XML file
> ============
> <?xml version="1.0" encoding="UTF-8"?>
> <SwInt:Request >
>                 <SwInt:RequestHeader>
>                        
> <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>                        
> <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>                         <SwInt:RequestRef>xyz</SwInt:RequestRef>
>                 </SwInt:RequestHeader>
> </SwInt:Request>
> XSLT file
> ======
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>    xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:SwInt="urn:swift:snl:ns.SwInt"
> xmlns:SwSec="urn:swift:snl:ns.SwSec" >
>         <xsl:output method="xml" version="1.0" encoding="UTF-8"
> indent="yes"/>
>         <xsl:template match="/">
>                 <xsl:copy-of select="/SwInt:Request/SwInt:RequestHeader"/>
>         </xsl:template>
> </xsl:stylesheet>
>  
> Output Xml comes with
> <?xml version="1.0" encoding="UTF-8"?>
>  
> Regards
> Ajay

All namespace prefixes in your XML file should be namespace qualified.

<?xml version="1.0" encoding="UTF-8"?>
<SwInt:Request  xmlns:SwInt="urn:swift:snl:ns.SwInt"
                xmlns:SwInt1="urn:swift:snl:ns.SwInt1" >
 <SwInt:RequestHeader>
  <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
  <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
  <SwInt:RequestRef>xyz</SwInt:RequestRef>
 </SwInt:RequestHeader>
</SwInt:Request>

The following is an edit of your xslt file

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:SwInt="urn:swift:snl:ns.SwInt"
    xmlns:SwInt1="urn:swift:snl:ns.SwInt1" >
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
     omit-xml-declaration="yes"/>
 <xsl:template match="/">
     <xsl:copy-of select="/SwInt:Request/SwInt:RequestHeader"/>
 </xsl:template>
</xsl:stylesheet>

Producing the output file

<SwInt:RequestHeader xmlns:SwInt="urn:swift:snl:ns.SwInt"
xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
  <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
  <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
  <SwInt:RequestRef>xyz</SwInt:RequestRef>
 </SwInt:RequestHeader>

I am unclear on what you are actually trying to do:

You only need in the stylesheet the prefix declarations used in the
stylesheet.  The xml documents need namespace declarations for the
prefixes they use.

Steven J. Hathaway




Re: Need to copy all elements of a parent element using xalan c++ (1.10)

Posted by sh...@e-z.net.
If you can get a handle to specify properties for the underlying
Xerces XMLReaders, you might try setting the UsingNamespaces to false.
The default for Xalan when creating XMLReaders is "true".

- Steve

>
> The issue may be in the Xerces-C XMLReader when trying to construct a
> nodeset.
> I have not tried such LAX parsing of XML documents with Xerces-C
> callbacks.
>
> When namespace prefixes are used, indicating qualified names, the
> namespaces must be specified.  This is part of wellformedness.  The
> presence of prefixes without qualifying names will cause the nodeset
> generators to fail during namespace resolution, resulting in an empty
> nodeset.
>
> I have tried several methods trying to workaround your absence of
> namespace qualified prefixes and failed.  If you must have this
> capability,
> you may need to coerce your source into a nodeset by other means and
> supply your own document tree walker. - Good Luck!
>
> Maybe someone else can shed some light on how to set specific features
> for XMLReaders to accomplish what you want.
>
> - Steve
>
> On 11/7/2011 5:39 PM, shathawa@e-z.net wrote:
>>> Hi,
>>>
>>> I need to copy all the child elements from the parent element to output
>>> xml using xalan c++  transform method. However, one of the child
>>> element
>>> is prefixed but does not have corresponding namespace.
>>>
>>> What should I do in xslt so that all the children elements of parent
>>> element are copied to output xml file without caring the namespace.
>>> Altova
>>> XMLSpy does that but When I use xalan c++ 1.10 , it does not copy.
>>>
>>> How I can achieve this using xalan c++  1.10 ?
>>>
>>> E.g.
>>> Input XML file
>>> ============
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <SwInt:Request>
>>>                  <SwInt:RequestHeader>
>>>
>>> <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>>>
>>> <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>>>                          <SwInt:RequestRef>xyz</SwInt:RequestRef>
>>>                  </SwInt:RequestHeader>
>>> </SwInt:Request>
>>> XSLT file
>>> ======
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <xsl:stylesheet version="1.0"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>>     xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:SwInt="urn:swift:snl:ns.SwInt"
>>> xmlns:SwSec="urn:swift:snl:ns.SwSec">
>>>          <xsl:output method="xml" version="1.0" encoding="UTF-8"
>>> indent="yes"/>
>>>          <xsl:template match="/">
>>>                  <xsl:copy-of
>>> select="/SwInt:Request/SwInt:RequestHeader"/>
>>>          </xsl:template>
>>> </xsl:stylesheet>
>>>
>>> Output Xml comes with
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> Regards
>>> Ajay
>> All namespace prefixes in your XML file should be namespace qualified.
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <SwInt:Request  xmlns:SwInt="urn:swift:snl:ns.SwInt"
>>                  xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
>>   <SwInt:RequestHeader>
>>    <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>>    <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>>    <SwInt:RequestRef>xyz</SwInt:RequestRef>
>>   </SwInt:RequestHeader>
>> </SwInt:Request>
>>
>> The following is an edit of your xslt file
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xsl:stylesheet version="1.0"
>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>      xmlns:SwInt="urn:swift:snl:ns.SwInt"
>>      xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
>>   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
>>       omit-xml-declaration="yes"/>
>>   <xsl:template match="/">
>>       <xsl:copy-of select="/SwInt:Request/SwInt:RequestHeader"/>
>>   </xsl:template>
>> </xsl:stylesheet>
>>
>> Producing the output file
>>
>> <SwInt:RequestHeader xmlns:SwInt="urn:swift:snl:ns.SwInt"
>> xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
>>    <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>>    <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>>    <SwInt:RequestRef>xyz</SwInt:RequestRef>
>>   </SwInt:RequestHeader>
>>
>> I am unclear on what you are actually trying to do:
>>
>> You only need in the stylesheet the prefix declarations used in the
>> stylesheet.  The xml documents need namespace declarations for the
>> prefixes they use.
>>
>> Steven J. Hathaway
>>
>>
>>
>
>



Re: Need to copy all elements of a parent element using xalan c++ (1.10)

Posted by Steve Hathaway <sh...@e-z.net>.
The issue may be in the Xerces-C XMLReader when trying to construct a 
nodeset.
I have not tried such LAX parsing of XML documents with Xerces-C callbacks.

When namespace prefixes are used, indicating qualified names, the
namespaces must be specified.  This is part of wellformedness.  The
presence of prefixes without qualifying names will cause the nodeset
generators to fail during namespace resolution, resulting in an empty 
nodeset.

I have tried several methods trying to workaround your absence of
namespace qualified prefixes and failed.  If you must have this capability,
you may need to coerce your source into a nodeset by other means and
supply your own document tree walker. - Good Luck!

Maybe someone else can shed some light on how to set specific features
for XMLReaders to accomplish what you want.

- Steve

On 11/7/2011 5:39 PM, shathawa@e-z.net wrote:
>> Hi,
>>   
>> I need to copy all the child elements from the parent element to output
>> xml using xalan c++  transform method. However, one of the child element
>> is prefixed but does not have corresponding namespace.
>>   
>> What should I do in xslt so that all the children elements of parent
>> element are copied to output xml file without caring the namespace. Altova
>> XMLSpy does that but When I use xalan c++ 1.10 , it does not copy. 
>>   
>> How I can achieve this using xalan c++  1.10 ?
>>   
>> E.g.
>> Input XML file
>> ============
>> <?xml version="1.0" encoding="UTF-8"?>
>> <SwInt:Request>
>>                  <SwInt:RequestHeader>
>>
>> <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>>
>> <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>>                          <SwInt:RequestRef>xyz</SwInt:RequestRef>
>>                  </SwInt:RequestHeader>
>> </SwInt:Request>
>> XSLT file
>> ======
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xsl:stylesheet version="1.0"
>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>     xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:SwInt="urn:swift:snl:ns.SwInt"
>> xmlns:SwSec="urn:swift:snl:ns.SwSec">
>>          <xsl:output method="xml" version="1.0" encoding="UTF-8"
>> indent="yes"/>
>>          <xsl:template match="/">
>>                  <xsl:copy-of select="/SwInt:Request/SwInt:RequestHeader"/>
>>          </xsl:template>
>> </xsl:stylesheet>
>>   
>> Output Xml comes with
>> <?xml version="1.0" encoding="UTF-8"?>
>>   
>> Regards
>> Ajay
> All namespace prefixes in your XML file should be namespace qualified.
>
> <?xml version="1.0" encoding="UTF-8"?>
> <SwInt:Request  xmlns:SwInt="urn:swift:snl:ns.SwInt"
>                  xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
>   <SwInt:RequestHeader>
>    <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>    <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>    <SwInt:RequestRef>xyz</SwInt:RequestRef>
>   </SwInt:RequestHeader>
> </SwInt:Request>
>
> The following is an edit of your xslt file
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>      xmlns:SwInt="urn:swift:snl:ns.SwInt"
>      xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
>   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
>       omit-xml-declaration="yes"/>
>   <xsl:template match="/">
>       <xsl:copy-of select="/SwInt:Request/SwInt:RequestHeader"/>
>   </xsl:template>
> </xsl:stylesheet>
>
> Producing the output file
>
> <SwInt:RequestHeader xmlns:SwInt="urn:swift:snl:ns.SwInt"
> xmlns:SwInt1="urn:swift:snl:ns.SwInt1">
>    <SwInt1:Requestor>cn=requestor,o=pimxbebb,o=swift1</SwInt1:Requestor>
>    <SwInt:Responder>cn=responder,o=pimxus33,o=swift</SwInt:Responder>
>    <SwInt:RequestRef>xyz</SwInt:RequestRef>
>   </SwInt:RequestHeader>
>
> I am unclear on what you are actually trying to do:
>
> You only need in the stylesheet the prefix declarations used in the
> stylesheet.  The xml documents need namespace declarations for the
> prefixes they use.
>
> Steven J. Hathaway
>
>
>