xsl-list
[Top] [All Lists]

RE: [xsl] missing xsi: before schemaLocation in the result xml file.

2006-10-12 16:02:37
I didn't use <xsl:apply-templates select="*"/> in my xslt file. I tried
to run the simplified xml and xslt files but I still got the same
result. Here are my simplied xml and xslt files. Could you please take a
look at them?


<blueprint xmlns="http://directv.com/bitstreams/blueprint";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://directv.com/bitstreams/blueprint
..\xsd\Blueprint.xsd" base_time="2004-11-05T12:00:00"
duration_seconds="12" tail_seconds=".25" version="1.00">
   <apg>
     <boot_object key="bo1">
          <boot_object_header>
                <object_type>0</object_type>
                <object_version>0</object_version>
                <reserved>65535</reserved>
              <time_first_referenced>compute</time_first_referenced>
                <object_id>1</object_id>
          </boot_object_header>
          <boot_object_body>
                <root_category_system_object_id ref="cso1"/>
<secondary_boot_cycle_time>4</secondary_boot_cycle_time>
                <secondary_boot_SCID>2049</secondary_boot_SCID>
<reserved1>255</reserved1>
                <reserved2>15</reserved2>
           </boot_object_body>
        </boot_object>
   </apg>
</blueprint>


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0 "
xmlns="http://directv.com/bitstreams/blueprint";
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes";
exclude-result-prefixes="xs xdt">

<xsl:import href="copy.xslt" />

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="*:boot_object">
  <advanced_boot_object>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
        <xsl:apply-templates select="boot_object_header"/>

  </advanced_boot_object>
</xsl:template>
        
<xsl:template match="*:boot_object_header">
   <advanced_boot_object_header>
        <object_type>153</object_type>
        <xsl:apply-templates select="node()[not(self::*:object_type)]"
/>
        </advanced_boot_object_header>
</xsl:template>
</xsl:stylesheet>

-----Original Message-----
From: Abel Braaksma [mailto:abel(_dot_)online(_at_)xs4all(_dot_)nl] 
Sent: Thursday, October 12, 2006 2:50 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] missing xsl: before schemaLocation in the result xml
file.

Lin, Jessica wrote:
I am converting xml to xml by using xslt. For some reason, my result
missed "xsl:" before schemaLocation. Could you please help me find
what's wrong?

[...]
And I use imported file copy.xslt during procession.

<xsl:template match="/ | node() | @* | comment() |
processing-instruction()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>


My result xml file:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns:bp="http://directv.com/bitstreams/blueprint";
           xmlns="http://directv.com/bitstreams/blueprint";

[...]
           schemaLocation="http://directv.com/bitstreams/blueprint
[...]
  

You use an extended version of the copy idiom. It should copy all 
elements including namespaces correctly. I tried your XML 
file,.simplified the XSLT like the following and it outputs the 'xsi' 
(I'm sure you meant 'xsi', not 'xsl') in front of the schemaLocation 
attribute.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="2.0">
    <xsl:output indent="yes" />
    <xsl:template match="/ | node() | @* | comment() |
        processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>


Though technically it is possible that the prefix changes, it seems not 
the case in your example. The namespace actually changes. Since you say 
that you <xls:import /> the copy xslt file, the problem may lay in your 
main file. If there's any instruction at all, any template at all, it 
will supersede the copy xslt. This is due to import precedence rules 
(copy.xslt is imported and has as such a lower precedence) and the fact 
that most specific rules always come first. Thus, if your main xslt file

looks something like this (I hope not):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="2.0"
    xpath-default-namespace="http://directv.com/bitstreams/blueprint";>
    <xsl:import href="copy.xslt" />
    <xsl:output indent="yes" />
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

your output will be off on the root node. But you must do something 
different than that, because you actually change the schemaLocation 
attribute, or you add it by hand somewhere in your code, without 
attaching it to the namespace again. If somewhere you do create it by 
hand, you can do the following to attach the namespace:

<xsl:attribute name="xsi:schemaLocation" 
namespace="http://www.w3.org/2001/XMLSchema-instance";  />

Though you don't need to specify any prefix here. If you don't the 
processor will think one up for you.

Hth,

Cheers,
-- Abel Braaksma
   http://www.nuntia.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>
--~--


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