Home. 
.

transparent

transparent

transparent

Altova Mailing List Archives


RE: [xsl] RE: unwanted and non prefix namespaces in output

From: "Michael Kay" <mhk@--------->
To:
Date: 8/1/2004 12:02:00 PM
> Michael,
> 
> Thanks, that did fix the problem.  Out of curiosity (strictly academic
> as my stylesheet does what I need it to), is there a more elegant
> solution to the problem?  Or is the stylesheet I wrote along 
> the correct
> lines?
> 
One could make minor tweaks but nothing radical. When using the identity
template I don't normally apply templates to attributes unless there are
changes to be made, I normally copy them using <xsl:copy-of select="@*"/>.
And where the body of a template rule consists entirely of an xsl:choose, I
would normally split it into multiple template rules, moving the "test"
condition to be part of the match pattern. (You can't do this in 1.0 if it
references a variable, but yours doesn't).

Michael Kay

> 
> -----Original Message-----
> From: Michael Kay [mailto:mhk@xxxxxxxxx] 
> Sent: Saturday, July 31, 2004 5:20 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] RE: unwanted and non prefix namespaces in output
> 
> I don't know what XSLT processor you're using, but the output 
> I'm seeing
> from Saxon (which I believe is correct) starts:
> 
> <sequence xmlns:ads="http://schemas.microsoft.com/ads/2003/sequence"
> version="1" description="foo" command="bar">
>   
>    <sequence version="1" description="Image" command="WIN2000">
>     
>       <task xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> 
> The first <sequence> element is generated from a literal 
> result element
> in your stylesheet. It is in no namespace because the 
> stylesheet doesn't
> put it in a namespace. It copies the declaration of xmlns:ads from the
> stylesheet because that's what literal result elements do.
> 
> The second <sequence> element is the same, but it doesn't redeclare
> xmlns:ads because that would be redundant.
> 
> The <task> element is generated by copying from the source 
> document. The
> element is in the ads/2003 namespace because it stays in the same
> namespace when you copy it. The original <task> element has 
> an in-scope
> namespace with prefix "" and uri "http://....ads/2003/...", so the
> copied element has one too.
> 
> I think, if I understand your problem description, that you probably
> want to write <xsl:copy> where you currently write 
> <sequence>. That way
> you will get the namespaces that are in scope for the source element,
> not those that are in scope in the stylesheet.
> 
> You made a lot of headway in four hours...
> 
> Michael Kay 
> 
> > -----Original Message-----
> > From: Joel Friedman [mailto:jfriedman@xxxxxxxxxxxx]
> > Sent: 31 July 2004 07:09
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] RE: unwanted and non prefix namespaces in output
> > 
> > I am very new to xslt (approx 4 hours) but I have managed to
> > (mostly) do
> > the simple task I am trying to perform.
> >  
> > I am attempting to take an xml file in this format (greatly 
> shortened 
> > for simplicity):
> >  
> > <?xml version="1.0" encoding="utf-16"?> <sequence version="1" 
> > description="foo" command="bar"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> > 
> >   <sequence version="1" description="Image" command="WIN2000"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >     <task>
> >       <command>foo</command>
> >       <parameters>
> >         <parameter>bar</parameter>
> >       </parameters>
> >     </task>
> >    <task>
> >     ...
> >    </task
> >   </sequence>
> > 
> >   <sequence version="1" description="Patch" command="WIN2000"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >     <task>
> >       <command>foo</command>
> >       <parameters>
> >         <parameter>bar</parameter>
> >       </parameters>
> >     </task>
> >     <task>
> >      ...
> >     </task
> >   </sequence>
> > 
> >   <sequence version="1" description="Patch" command="WIN2K3"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >     <task>
> >       <command>foo</command>
> >       <parameters>
> >         <parameter>bar</parameter>
> >       </parameters>
> >     </task>
> >    <task>
> >     ...
> >    </task
> >   </sequence>
> > 
> >  <sequence version="1" description="foo" command="bar"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >    ...
> >  </sequence>
> > 
> >   ...
> >  
> > </sequence>
> >  
> >  
> > And apply this XSL:
> >  
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> >  
> > xmlns:ads="http://schemas.microsoft.com/ads/2003/sequence"
> >                 version="1.0">
> >  
> >   <xsl:output method="xml" indent="yes"/>
> >   <xsl:variable name="osName"
> > select="ads:sequence/ads:sequence/@command"/>
> >     
> >   <xsl:template match="/">
> >     <xsl:apply-templates select="ads:sequence"/>
> >   </xsl:template>
> >  
> >   <xsl:template match="ads:sequence">
> >     <xsl:choose>
> >       <xsl:when test="(@description='Patch')">
> >         <xsl:if test="@command=$osName">
> >           <sequence>
> >             <xsl:apply-templates select="@*|node()"/>
> >           </sequence>
> >           </xsl:if>
> >       </xsl:when>
> >       <xsl:otherwise>
> >         <sequence>
> >           <xsl:apply-templates select="@*|node()"/>
> >         </sequence>
> >       </xsl:otherwise>
> >     </xsl:choose>
> >   </xsl:template>
> >  
> >   <xsl:template match="@*|node()">
> >     <xsl:copy>
> >       <xsl:apply-templates select="@*|node()"/>
> >     </xsl:copy>
> >   </xsl:template>
> >   
> > </xsl:stylesheet>
> >  
> >  
> > Basically I'm trying to fetch the OS Name from the command 
> attribute 
> > of the second sequence (fixed location)  Then the if OS matches the 
> > command attribute for the sequence with a description of 
> 'Patch', copy
> 
> > it over.
> > Also copy over everything else that isn't a Patch sequence.  So 
> > basically my output should be identical to my input minus the Patch 
> > sequence where the OS does not match.  My problem enlies that every 
> > 'task ' element has the namespace added to it but the 
> sequence element
> 
> > does not.
> >  
> > ..sample output:
> >  
> > <?xml version="1.0" encoding="UTF-16"?> <sequence version="1" 
> > description="foo" command="bar">
> >  
> >  <sequence version="1" description="Image" command="WIN2000">
> >   <task  xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >    <command>foo</command>
> >    <parameters>
> >     <parameter>bar</parameter>
> >    </parameters>
> >   </task>
> >  
> >  
> > The exclude-result-prefixes="ads" squashed my namespace on the root 
> > sequence element (which I don't want).  I need the 
> namespace to only 
> > be defined on all sequence blocks.  Just like the input.  The logic 
> > part of not copying over the block I do not need does work.  It's 
> > probably not the best way, but it is functional.  Forgive 
> me if I did 
> > not use the correct XSL grammar while trying to explain my problem.
> >  
> > Anybody have an idea of a direction I should look in for a solution?
> >  
> > Thanks in advance,
> >  
> > --Joel
> > 
> > ________________________________
> > 
> > From: Joel Friedman
> > Sent: Saturday, July 31, 2004 2:07 AM
> > To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'
> > Subject: unwanted and non prefix namespaces in output
> > 
> > 
> > I am very new to xslt (approx 4 hours) but I have managed to
> > (mostly) do
> > the simple task I am trying to perform.
> >  
> > I am attempting to take an xml file in this format (greatly 
> shortened 
> > for simplicity):
> >  
> > <?xml version="1.0" encoding="utf-16"?> <sequence version="1" 
> > description="foo" command="bar"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> > 
> >   <sequence version="1" description="Image" command="WIN2000"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >     <task>
> >       <command>foo</command>
> >       <parameters>
> >         <parameter>bar</parameter>
> >       </parameters>
> >     </task>
> >    <task>
> >     ...
> >    </task
> >   </sequence>
> > 
> >   <sequence version="1" description="Patch" command="WIN2000"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >     <task>
> >       <command>foo</command>
> >       <parameters>
> >         <parameter>bar</parameter>
> >       </parameters>
> >     </task>
> >     <task>
> >      ...
> >     </task
> >   </sequence>
> > 
> >   <sequence version="1" description="Patch" command="WIN2K3"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >     <task>
> >       <command>foo</command>
> >       <parameters>
> >         <parameter>bar</parameter>
> >       </parameters>
> >     </task>
> >    <task>
> >     ...
> >    </task
> >   </sequence>
> > 
> >  <sequence version="1" description="foo" command="bar"
> > xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >    ...
> >  </sequence>
> > 
> >   ...
> >  
> > </sequence>
> >  
> >  
> > And apply this XSL:
> >  
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> >  
> > xmlns:ads="http://schemas.microsoft.com/ads/2003/sequence"
> >                 version="1.0">
> >  
> >   <xsl:output method="xml" indent="yes"/>
> >   <xsl:variable name="osName"
> > select="ads:sequence/ads:sequence/@command"/>
> >     
> >   <xsl:template match="/">
> >     <xsl:apply-templates select="ads:sequence"/>
> >   </xsl:template>
> >  
> >   <xsl:template match="ads:sequence">
> >     <xsl:choose>
> >       <xsl:when test="(@description='Patch')">
> >         <xsl:if test="@command=$osName">
> >           <sequence>
> >             <xsl:apply-templates select="@*|node()"/>
> >           </sequence>
> >           </xsl:if>
> >       </xsl:when>
> >       <xsl:otherwise>
> >         <sequence>
> >           <xsl:apply-templates select="@*|node()"/>
> >         </sequence>
> >       </xsl:otherwise>
> >     </xsl:choose>
> >   </xsl:template>
> >  
> >   <xsl:template match="@*|node()">
> >     <xsl:copy>
> >       <xsl:apply-templates select="@*|node()"/>
> >     </xsl:copy>
> >   </xsl:template>
> >   
> > </xsl:stylesheet>
> >  
> >  
> > Basically I'm trying to fetch the OS Name from the command 
> attribute 
> > of the second sequence (fixed location)  Then the if OS matches the 
> > command attribute for the sequence with a description of 
> 'Patch', copy
> 
> > it over.
> > Also copy over everything else that isn't a Patch sequence.  So 
> > basically my output should be identical to my input minus the Patch 
> > sequence where the OS does not match.  My problem enlies that every 
> > 'task ' element has the namespace added to it but the 
> sequence element
> 
> > does not.
> >  
> > ..sample output:
> >  
> > <?xml version="1.0" encoding="UTF-16"?> <sequence version="1" 
> > description="foo" command="bar">
> >  
> >  <sequence version="1" description="Image" command="WIN2000">
> >   <task  xmlns="http://schemas.microsoft.com/ads/2003/sequence">
> >    <command>foo</command>
> >    <parameters>
> >     <parameter>bar</parameter>
> >    </parameters>
> >   </task>
> >  
> >  
> > The exclude-result-prefixes="ads" squashed my namespace on the root 
> > sequence element (which I don't want).  I need the 
> namespace to only 
> > be defined on all sequence blocks.  Just like the input.  The logic 
> > part of not copying over the block I do not need does work.  It's 
> > probably not the best way, but it is functional.  Forgive 
> me if I did 
> > not use the correct XSL grammar while trying to explain my problem.
> >  
> > Anybody have an idea of a direction I should look in for a solution?
> >  
> > Thanks in advance,
> >  
> > --Joel


transparent
Print
Mail
Like It
Disclaimer
.

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.

.
.

transparent

transparent