xsl-list
[Top] [All Lists]

Re: [xsl] How to strip off all <xsd:annotation> ...</xsd.annotation> tags

2009-08-13 11:31:48
Thank you Michael.

However I would like to keep the xml:space="preserve" instruction because it 
ensures that the output is on a minimum human readable format.
Without this I have one very, very long line. This is unacceptable for me.

Would it help perhaps to move the "xml:space="preserve" instruction to another 
place in the stylesheet?
Maybe something like this:

   <xsl:template match="@* | node()" xml:space="preserve">
     <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

or

   <xsl:template match="@* | node()">
     <xsl:copy>
        <xsl:apply-templates select="@* | node()"/ xml:space="preserve">
      </xsl:copy>
    </xsl:template>

Sorry, I am not an expert in XSLT.

Ben

On Thu, 13 Aug 2009 16:52:17 +0200, Michael Ludwig wrote:

Martin Honnen schrieb:
Ben Stover wrote:

thank you for your suggestion. Unfortunately your script show the
following error (when running with Saxon):

  XTDE0410: An attribute node (targetNamespace) cannot be created
  after the children of the containing element at xsl:apply-templates
  (file:/D:/xslt/Saxon/strip%20annotation%20tags/stripannotationtags.xsl#11)
     processing /xsd:schema/@targetNamespace
  in built-in template rule

Do you know what's wrong?

I can't explain that error. And I have now tried the stylesheet
against the schema http://www.w3.org/2001/xml.xsd and it processes
that without errors. Can you provide a minimal but complete XML input
document that causes that error?

Ben, please keep things like this on list instead of sending mail
privately. Your stylesheet is not the one Martin posted; you introduced
a significant change:

<xsl:stylesheet xml:space="preserve"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   xmlns:xsd="http://www.w3.org/2001/XMLSchema";
   version="2.0">

   <xsl:template match="xsd:annotation"/>

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

</xsl:stylesheet>

The xml:space on the xsl:stylesheet is a very bad idea. It leads to
every single whitespace-only text node being relevant, which makes the
stylesheet create whitespace-only text nodes after the <xsl:template>
and after <xsl:copy> (and elsewhere). So child nodes are created
*before* applying templates to attributes. Creating attributes after
having created child nodes is not allowed.

Just to illustrate the principle here, the following will work (but it's
a very odd arrangement, avoid that):

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

Just get rid of the xml:space="preserve" - it's the source of your
problems. Sometimes you'll want whitespace-only text nodes in your
source tree (XSLT stylesheet module) to be kept and copied, but then
you'll probably also want to localize the effect of the xml:space you
insert to achieve that effect.

-- 
Michael Ludwig

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