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>
--+--