OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: transfer namespace within XSL



Ivo,

First problem: The default namespace in effect for the source XML Doc
(as specified by 'xmlns =
"http://www.portfolio.org/Portfolio/Response"') will cause parts of
your template to not fire, because you're looking for elements in the
"xhtml" namespace.

Second problem: Using my favorite XSLT engine (Sablotron), I still get
namespace declarations on the output elements, even though no element
is in the scope of any of the declared namespaces.  (I'm guessing that
you've seen this problem in another incarnation of your example.)

Solutions: For the first problem, declare your source XML Doc's
default namespace in the stylesheet, and use the corresponding prefix
to select the desired content; for the second problem, use the
<xsl:element> and <xsl:attribute> constructs, which give you control
over the output namespace declarations.

The following stylesheet gives output similar to that which you said
you wanted, with the exception that you get a DOCTYPE declaration (as
a result of <xsl:output ... doctype-system="..." .../>.

<?xml version="1.0"?>
<!-- quotes.xsl: Transform to Quote.dtd vocabulary -->
<xsl:stylesheet version="1.0"
  xmlns:resp="http://www.portfolio.org/Portfolio/Response"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <xsl:output method="xml" doctype-system="Quote.dtd" indent="yes"/>
  <xsl:template match="/">
    <xsl:element name="Quotes">
      <xsl:for-each select="resp:PortfolioResp/resp:Quote">
        <xsl:element name="Quote">
          <xsl:attribute name="Symbol">
            <xsl:value-of select="resp:Symbol"/>
          </xsl:attribute>
          <xsl:element name="Time">
            <xsl:value-of select="resp:Time"/>
          </xsl:element>
          <xsl:element name="Price">
            <xsl:value-of select="resp:Price"/>
          </xsl:element>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>


Hope it helps.

Steve Rowe
MNIS-TextWise Labs

Ivo Ottiger wrote:
> I try to transform the following XML Doc
>
> <?xml version = "1.0" encoding = "UTF-8"?>
> <PortfolioResp xmlns = "http://www.portfolio.org/Portfolio/Response"
> xmlns:xhtml="http://www.w3.org/1999/xhtml">
> 	<Quote>
> 		<Symbol>SUNW</Symbol>
> 		<Time>9:51AM</Time>
> 		<Price>16.06</Price>
> 		<Change>-1.53%</Change>
> 		<Volume>3,729,800</Volume>
> 	</Quote>
> </PortfolioResp>
>
> whith the following XSL into a new one without namespace
>
> <?xml version="1.0"?>
> <!-- quotes.xsl: Transform to Quote.dtd vocabulary -->
> <xsl:stylesheet version="1.0"
>   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>   xmlns:xhtml="http://www.w3.org/1999/xhtml">
>   <xsl:output method="xml" doctype-system="Quote.dtd" indent="yes"/>
>   <xsl:template match="/">
>     <Quotes>
>       <xsl:for-each select="xhtml:PortfolioResp/xhtml:Quote">
>         <Quote>
>           <Symbol Ticker="{xhtml:Symbol}"></Symbol>
>           <Time><xsl:value-of select="xhtml:Time"/></Time>
>           <Price><xsl:value-of select="xhtml:Price"/></Price>
>         </Quote>
>       </xsl:for-each>
>     </Quotes>
>   </xsl:template>
> </xsl:stylesheet>
>
> which should look like this one
>
> <?xml version = "1.0" encoding = "UTF-8"?>
> <Quotes>
> 	<Quote Symbol="SUNW">
> 		<Time>9:51AM</Time>
> 		<Price>16.06</Price>
> 	</Quote>
> </Quotes>
>
> But without any success. Can somebody help me.
> Thanks.