private void LoadOutput()
{
ContextInfo ctxInfo = _input.GetAttributes(_outputAttributes);
Output output = _compiler.Output;
XmlWriterSettings settings = output.Settings;
int currentPrec = _compiler.CurrentPrecedence;
TriState triState;
QilName name = ParseQNameAttribute(0);
if (name != null) ReportNYI("xsl:output/@name");
if (_input.MoveToXsltAttribute(1, "method"))
{
if (output.MethodPrec <= currentPrec)
{
_compiler.EnterForwardsCompatible();
XmlOutputMethod outputMethod;
XmlQualifiedName method = ParseOutputMethod(_input.Value, out outputMethod);
if (_compiler.ExitForwardsCompatible(_input.ForwardCompatibility) && method != null)
{
if (currentPrec == output.MethodPrec && !output.Method.Equals(method))
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "method");
}
settings.OutputMethod = outputMethod;
output.Method = method;
output.MethodPrec = currentPrec;
}
}
}
TriState byteOrderMask = ParseYesNoAttribute(2, "byte-order-mark");
if (byteOrderMask != TriState.Unknown) ReportNYI("xsl:output/@byte-order-mark");
if (_input.MoveToXsltAttribute(3, "cdata-section-elements"))
{
// Do not check the import precedence, the effective value is the union of all specified values
_compiler.EnterForwardsCompatible();
string[] qnames = XmlConvert.SplitString(_input.Value);
List<XmlQualifiedName> list = new List<XmlQualifiedName>();
for (int i = 0; i < qnames.Length; i++)
{
list.Add(ResolveQName(/*ignoreDefaultNs:*/false, qnames[i]));
}
if (_compiler.ExitForwardsCompatible(_input.ForwardCompatibility))
{
settings.CDataSectionElements.AddRange(list);
}
}
if (_input.MoveToXsltAttribute(4, "doctype-public"))
{
if (output.DocTypePublicPrec <= currentPrec)
{
if (currentPrec == output.DocTypePublicPrec && settings.DocTypePublic != _input.Value)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "doctype-public");
}
settings.DocTypePublic = _input.Value;
output.DocTypePublicPrec = currentPrec;
}
}
if (_input.MoveToXsltAttribute(5, "doctype-system"))
{
if (output.DocTypeSystemPrec <= currentPrec)
{
if (currentPrec == output.DocTypeSystemPrec && settings.DocTypeSystem != _input.Value)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "doctype-system");
}
settings.DocTypeSystem = _input.Value;
output.DocTypeSystemPrec = currentPrec;
}
}
if (_input.MoveToXsltAttribute(6, "encoding"))
{
if (output.EncodingPrec <= currentPrec)
{
try
{
// Encoding.GetEncoding() should never throw NotSupportedException, only ArgumentException
Encoding encoding = Encoding.GetEncoding(_input.Value);
if (currentPrec == output.EncodingPrec && output.Encoding != _input.Value)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "encoding");
}
settings.Encoding = encoding;
output.Encoding = _input.Value;
output.EncodingPrec = currentPrec;
}
catch (ArgumentException)
{
if (!_input.ForwardCompatibility)
{
ReportWarning(/*[XT_004]*/SR.Xslt_InvalidEncoding, _input.Value);
}
}
}
}
bool escapeUriAttributes = ParseYesNoAttribute(7, "escape-uri-attributes") != TriState.False;
if (!escapeUriAttributes) ReportNYI("xsl:output/@escape-uri-attributes == flase()");
bool includeContentType = ParseYesNoAttribute(8, "include-content-type") != TriState.False;
if (!includeContentType) ReportNYI("xsl:output/@include-content-type == flase()");
triState = ParseYesNoAttribute(9, "indent");
if (triState != TriState.Unknown)
{
if (output.IndentPrec <= currentPrec)
{
bool indent = (triState == TriState.True);
if (currentPrec == output.IndentPrec && settings.Indent != indent)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "indent");
}
settings.Indent = indent;
output.IndentPrec = currentPrec;
}
}
if (_input.MoveToXsltAttribute(10, "media-type"))
{
if (output.MediaTypePrec <= currentPrec)
{
if (currentPrec == output.MediaTypePrec && settings.MediaType != _input.Value)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "media-type");
}
settings.MediaType = _input.Value;
output.MediaTypePrec = currentPrec;
}
}
if (_input.MoveToXsltAttribute(11, "normalization-form"))
{
ReportNYI("xsl:output/@normalization-form");
}
triState = ParseYesNoAttribute(12, "omit-xml-declaration");
if (triState != TriState.Unknown)
{
if (output.OmitXmlDeclarationPrec <= currentPrec)
{
bool omitXmlDeclaration = (triState == TriState.True);
if (currentPrec == output.OmitXmlDeclarationPrec && settings.OmitXmlDeclaration != omitXmlDeclaration)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "omit-xml-declaration");
}
settings.OmitXmlDeclaration = omitXmlDeclaration;
output.OmitXmlDeclarationPrec = currentPrec;
}
}
triState = ParseYesNoAttribute(13, "standalone");
if (triState != TriState.Unknown)
{
if (output.StandalonePrec <= currentPrec)
{
XmlStandalone standalone = (triState == TriState.True) ? XmlStandalone.Yes : XmlStandalone.No;
if (currentPrec == output.StandalonePrec && settings.Standalone != standalone)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "standalone");
}
settings.Standalone = standalone;
output.StandalonePrec = currentPrec;
}
}
bool undeclarePrefixes = ParseYesNoAttribute(14, "undeclare-prefixes") == TriState.True;
if (undeclarePrefixes) ReportNYI("xsl:output/@undeclare-prefixes == true()");
List<QilName> useCharacterMaps = ParseUseCharacterMaps(15);
if (useCharacterMaps.Count != 0) ReportNYI("xsl:output/@use-character-maps");
if (_input.MoveToXsltAttribute(16, "version"))
{
if (output.VersionPrec <= currentPrec)
{
if (currentPrec == output.VersionPrec && output.Version != _input.Value)
{
ReportWarning(/*[XT1560]*/SR.Xslt_AttributeRedefinition, "version");
}
// BUGBUG: Check that version is a valid nmtoken
// ignore version since we support only one version for both xml (1.0) and html (4.0)
output.Version = _input.Value;
output.VersionPrec = currentPrec;
}
}
CheckNoContent();
}