private QilNode CompileCopy(XslNode copy)
{
QilNode node = GetCurrentNode();
_f.CheckNodeNotRtf(node);
if ((node.XmlType.NodeKinds & InvalidatingNodes) != XmlNodeKindFlags.None)
{
_outputScope.InvalidateAllPrefixes();
}
if (node.XmlType.NodeKinds == XmlNodeKindFlags.Element)
{
// Context node is always an element
// The namespace nodes of the current node are automatically copied
QilList content = InstructionList();
content.Add(_f.XPathNamespace(node));
_outputScope.PushScope();
_outputScope.InvalidateAllPrefixes();
QilNode result = CompileInstructions(copy.Content, content);
_outputScope.PopScope();
return _f.ElementCtor(_f.NameOf(node), result);
}
else if (node.XmlType.NodeKinds == XmlNodeKindFlags.Document)
{
// Context node is always a document
// xsl:copy will not create a document node, but will just use the content template
return CompileInstructions(copy.Content);
}
else if ((node.XmlType.NodeKinds & (XmlNodeKindFlags.Element | XmlNodeKindFlags.Document)) == XmlNodeKindFlags.None)
{
// Context node is neither an element, nor a document
// The content of xsl:copy is not instantiated
return node;
}
else
{
// Static classifying of the context node is not possible
return _f.XsltCopy(node, CompileInstructions(copy.Content));
}
}