Re: [xsl] Moving (promoting) XML elements through XSL

Subject: Re: [xsl] Moving (promoting) XML elements through XSL
From: David Carlisle <davidc@xxxxxxxxx>
Date: Thu, 29 Jun 2006 23:35:53 +0100
>  I think I made your suggested changes
> correctly, but my output hasn't changed. The indexterm element still
> doesn't appear in my output XML doc.

You shouldn't get any output at all.

$ saxon topic.xml topic.xsl
Error at xsl:copy on line 17 of file:/c:/Temp/topic.xsl:
  Cannot write an attribute when there is no open start tag
Transformation failed: Run-time errors were reported


As the error message says you need to do attributes first, so apply
templates to @* then make your index then do other stuff:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
        <xsl:output indent="yes"/>
        <xsl:template match="/topic">
                <xsl:copy>
                        <xsl:apply-templates select="@*"/>
                        <prolog>
                                <metadata>
                                        <keywords>
                                                <xsl:copy-of
select="title/indexterm"/>
                                        </keywords>
                                </metadata>
                        </prolog>
                        <xsl:apply-templates select="node()"/>
                </xsl:copy>
        </xsl:template>
        <xsl:template match="indexterm"/>
        <xsl:template match="@*|node()">
                <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
        </xsl:template>
</xsl:stylesheet>


$ saxon topic.xml topic.xsl
<?xml version="1.0" encoding="utf-8"?>
<topic id="i267011">
   <prolog>
      <metadata>
         <keywords>
            <indexterm>Hardware Requirements</indexterm>
            <indexterm>Software Requirements</indexterm>
         </keywords>
      </metadata>
   </prolog>

   <title>

         Software Requirements
      </title>

   <body>
    ..
      </body>

</topic>

Current Thread