xsl-list
[Top] [All Lists]

Re: [xsl] Version 2.0 Tips and Tricks

2008-04-04 01:40:24
in fact if I look in your transformation the point that seems most
likely to be causing it would be if  <xsl:apply-templates
mode="F-chic-auth-date"/> did something to call the copying template
on an attribute somewhere, for example with the following input:

<journals att="x">

<journalcode>CIJB</journalcode>
<ref-govpub>test
</ref-govpub>
</journals>

and the following stylesheet

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0" xmlns:aid="example.org">
<xsl:output method="xml" encoding="utf-8"/>
   <xsl:template match="@*|node()">
  <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="ref-govpub">

<!-- journal Code check  -->

 <xsl:if test="string(//journalcode)='CIJB'">
  <xsl:copy>
 <xsl:attribute name="aid:pstyle">ref</xsl:attribute>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates select="authorfield"/>
 <xsl:apply-templates select="docpubtitle"/>
 <xsl:apply-templates select="pubnum"/>
 <xsl:apply-templates select="pubfield"/>
<xsl:if test="./chaptitle">
<char><xsl:text>, </xsl:text></char>
   <xsl:apply-templates select="chaptitle"/>
</xsl:if>
   <xsl:if test="./addinfo">
   <xsl:apply-templates select="./addinfo"/>
</xsl:if>
 <xsl:apply-templates mode="F-chic-auth-date"/>
<char><xsl:text>.</xsl:text></char>
  </xsl:copy>
  </xsl:if>
</xsl:template>

<xsl:template match="text()" mode="F-chic-auth-date">
hello
<xsl:apply-templates select="/*/@*"/>
</xsl:template>
</xsl:stylesheet>

which of course gives the error that an attribute node cannot be
created after the child nodes of an element, because F-chic-auth-date
is running in the context of <ref-govpub> which is copied out,
followed by some other elements that are created and closed. After
which the mode is called, and the attribute is attempted to be added
at a place where an attribute cannot be added. Obviously the above is
just an example, but does it sound like anything you are doing in the
rest of your transformation?

Cheers,
Bryan Rasmussen


On Fri, Apr 4, 2008 at 10:32 AM, bryan rasmussen
<rasmussen(_dot_)bryan(_at_)gmail(_dot_)com> wrote:
On Fri, Apr 4, 2008 at 10:05 AM, Pankaj Chaturvedi

<pankaj(_dot_)chaturvedi(_at_)idsil(_dot_)com> wrote:
 >

 why are you copying an attribute and then attempting to apply
 >  templates on attributes or nodes below it?
 >
 >
 >  Don't it means template copies input to output.


 sure this:

 <xsl:template match="@*">
  <xsl:copy/>
  </xsl:template>

 is matching and copying an attribute

 this is

 <xsl:template match="@*">
        <xsl:apply-templates select="@*"/>
  </xsl:template>

 matching an attribute and then applying templates on attributes  that
 are children of that attribute, which is probably not gonna be too
 successful.

 thus this


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

 is matching attributes and nodes
 copying the matched, applying templates on any child attributes or
 nodes of the matched attribute or node. This shouldn't be causing your
 trouble, since it is allowed, it just always struck me as wasteful
 when I see it.

 Actually I can't see anything specifically in your code that is
 causing the problem you mention.


 Cheers,
 Bryan Rasmussen


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

<Prev in Thread] Current Thread [Next in Thread>