xsl-list
[Top] [All Lists]

RE: RE: unwanted and non prefix namespaces in output

2004-07-31 09:24:24
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?

Thanks,

--Joel

-----Original Message-----
From: Michael Kay [mailto:mhk(_at_)mhk(_dot_)me(_dot_)uk] 
Sent: Saturday, July 31, 2004 5:20 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)datapipe(_dot_)com]
Sent: 31 July 2004 07:09
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)lists(_dot_)mulberrytech(_dot_)com'
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


--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--



--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--




<Prev in Thread] Current Thread [Next in Thread>