I fixed the compilation problem by changing the perl code generated at the 
end_element handler for xsp:element code to:

        return '} $parent->appendChild($elem); '. "\n";

from:
        return '$parent = $parent->getParentNode;' . "\n";

This is line ~691 in XSP.pm.  This gets the xsp page compiling.

Even after this fix, though, I think there's some flaw in the nesting logic 
for generating code to create elements in 1.6.  When I call a function, it 
ends up adding the elements defined by that function to the parent node of 
the node I want to add them to.  The node to which I thought I was adding new
elements in my function is instead added to the same parent _after_ the
elements generated by my function call.  

The 1.6rc3 seems to attempt to localize $parent by doing a "my $parent=$elem"
and leaving the brace open when startig new nodes.  However, when a function
is called in that scope, the function call doesn't pick up the my'ed $parent
in the scope from which it's called, but rather picks up the $parent from the
scope in which the function was defined.  I don't know if that's expected
behaviour for perl or not?

The line that I deleted ($parent=$parent.getParentNode;) won't affect anything 
because of the scoping.  If it is inside the right brace, it only affects the 
local $parent and sets it to the newly created element ($elem),  but the 
value will be lost when we go out of the block, right?   If it's outside the 
brace, there shouldn't be a need to back up one level, because only the local 
$parent was changed in the block.

I worked around it by explicitly passing a $parent parameter to my functions.
Everything works as expected now, but I don't know if this is a reasonable
solution.  It seems contradictory to the philosophy of blindly embedding tags.

Thanks,
Kevin

1.6rc3 with my fix generates:
 my $elem; { $elem = $document->createElement(q|CurrentDirectory|); my
 $parent = $elem;
include_file($dir."/DirectoryInfo.xml");
} $parent->appendChild($elem);

and:

sub include_file {
 my ($filename)=@_;
          my $elem; { $elem = $document->createElement(q|xi:include|);my
$parent = $elem;
$parent->setAttribute(q|xmlns:xi|, "". q|http://www.w3.org/2001/XInclude|);
$parent->setAttribute(q|href|, "". do {$filename});
} $parent->appendChild($elem);

} # end of include_file



1.52 generates:
 my $elem; { $elem = $document->createElement(q|CurrentDirectory|); my
 $parent = $elem;
include_file($dir."/DirectoryInfo.xml");
} $parent->appendChild($elem);

and:

sub include_file {
 my ($filename)=@_;
          { my $elem =
$document->createElement(q|xi:include|);$parent->appendChild($elem); $parent
= $elem; }
$parent->setAttribute(q|xmlns:xi|, "". q|http://www.w3.org/2001/XInclude|);
$parent->setAttribute(q|href|, "". do {$filename});
$parent = $parent->getParentNode;

} # end of include_file

-------------------------------------------------------


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to