protected virtual IEnumerable<StylesheetApplication> DiscoverWork(TemplateData templateData, XPathVariable[] parameters, Stylesheet stylesheet) { TraceSources.TemplateSource.TraceInformation("Processing stylesheet instructions: {0}", (object)stylesheet.Name); CustomXsltContext xpathContext = CreateCustomXsltContext(templateData.IgnoredVersionComponent); xpathContext.PushVariableScope(templateData.Document.Root, parameters); // 1 XElement[] inputElements = templateData.Document.XPathSelectElements(stylesheet.SelectExpression, xpathContext).ToArray(); foreach (XElement inputElement in inputElements) { xpathContext.PushVariableScope(inputElement, stylesheet.Variables); // 2 string saveAs = ResultToString(inputElement.XPathEvaluate(stylesheet.OutputExpression, xpathContext)); string version = ResultToString(inputElement.XPathEvaluate(stylesheet.VersionExpression, xpathContext)); string assetId = ResultToString(inputElement.XPathEvaluate(stylesheet.AssetIdExpression, xpathContext)); List<AssetIdentifier> aliases = new List<AssetIdentifier>(); List<AssetSection> sections = new List<AssetSection>(); // eval condition, shortcut and log instead of wrapping entire loop in if if (!EvalCondition(xpathContext, inputElement, stylesheet.ConditionExpression)) { TraceSources.TemplateSource.TraceVerbose("{0}, {1} => Condition not met", assetId, version); xpathContext.PopVariableScope(); // 2 continue; } Uri newUri = new Uri(saveAs, UriKind.RelativeOrAbsolute); // register url this._fileResolver.Add(assetId, new Version(version), ref newUri); TraceSources.TemplateSource.TraceVerbose("{0}, {1} => {2}", assetId, version, newUri.ToString()); // aliases foreach (AliasRegistration alias in stylesheet.AssetAliases) { XElement[] aliasInputElements = inputElement.XPathSelectElements(alias.SelectExpression, xpathContext).ToArray(); foreach (XElement aliasInputElement in aliasInputElements) { xpathContext.PushVariableScope(aliasInputElement, alias.Variables); // 3 string aliasVersion = ResultToString(aliasInputElement.XPathEvaluate(alias.VersionExpression, xpathContext)); string aliasAssetId = ResultToString(aliasInputElement.XPathEvaluate(alias.AssetIdExpression, xpathContext)); // eval condition if (EvalCondition(xpathContext, aliasInputElement, alias.ConditionExpression)) { this._fileResolver.Add(aliasAssetId, new Version(aliasVersion), newUri); aliases.Add(AssetIdentifier.Parse(aliasAssetId)); TraceSources.TemplateSource.TraceVerbose("{0}, {1} (Alias) => {2}", aliasAssetId, aliasVersion, newUri.ToString()); } else { TraceSources.TemplateSource.TraceVerbose("{0}, {1} (Alias) => Condition not met", assetId, version); } xpathContext.PopVariableScope(); // 3 } } // sections foreach (SectionRegistration section in stylesheet.Sections) { XElement[] sectionInputElements = inputElement.XPathSelectElements(section.SelectExpression, xpathContext).ToArray(); foreach (XElement sectionInputElement in sectionInputElements) { xpathContext.PushVariableScope(sectionInputElement, section.Variables); // 4 string sectionName = ResultToString(sectionInputElement.XPathEvaluate(section.NameExpression, xpathContext)); string sectionVersion = ResultToString(sectionInputElement.XPathEvaluate(section.VersionExpression, xpathContext)); string sectionAssetId = ResultToString(sectionInputElement.XPathEvaluate(section.AssetIdExpression, xpathContext)); // eval condition if (EvalCondition(xpathContext, sectionInputElement, section.ConditionExpression)) { Uri sectionUri = new Uri(newUri + "#" + sectionName, UriKind.Relative); this._fileResolver.Add(sectionAssetId, new Version(sectionVersion), sectionUri); TraceSources.TemplateSource.TraceVerbose("{0}, {1}, (Section: {2}) => {3}", sectionAssetId, sectionVersion, sectionName, sectionUri.ToString()); sections.Add(new AssetSection(AssetIdentifier.Parse(sectionAssetId), sectionName, sectionUri)); } else { TraceSources.TemplateSource.TraceVerbose("{0}, {1}, (Section: {2}) => Condition not met", sectionAssetId, sectionVersion, sectionName); } xpathContext.PopVariableScope(); // 4 } } var xsltParams = ResolveXsltParams(stylesheet.XsltParams, inputElement, xpathContext).ToArray(); xpathContext.PopVariableScope(); // 2 yield return new StylesheetApplication { StylesheetName = stylesheet.Name, Asset = new AssetIdentifier(assetId, new Version(version)), Aliases = aliases, /* list of AssetIdentifiers */ Sections = sections, /* list of AssetSection */ SaveAs = newUri.ToString(), Transform = stylesheet.Transform, InputElement = inputElement, XsltParams = xsltParams }; } xpathContext.PopVariableScope(); // 1 }
private IEnumerable<UnitOfWork> DiscoverWork(TemplateData templateData, XPathVariable[] parameters, Resource[] resources) { CustomXsltContext xpathContext = CreateCustomXsltContext(templateData.IgnoredVersionComponent); xpathContext.PushVariableScope(templateData.Document.Root, parameters); for (int i = 0; i < resources.Length; i++) { xpathContext.PushVariableScope(templateData.Document.Root, resources[i].Variables); if (EvalCondition(xpathContext, templateData.Document.Root, resources[i].ConditionExpression)) { string expandedSource = EvalValue(xpathContext, templateData.Document.Root, resources[i].Source); string expandedOutput = EvalValue(xpathContext, templateData.Document.Root, resources[i].Output); List<IResourceTransform> transforms = new List<IResourceTransform>(); foreach (var resourceTransform in resources[i].Transforms) { using (CompositionContainer localContainer = new CompositionContainer(this._container.Catalog)) { string dirName = Path.GetDirectoryName(expandedSource); CompositionBatch batch = new CompositionBatch(); var exportMetadata = new Dictionary<string, object>(); exportMetadata.Add(CompositionConstants.ExportTypeIdentityMetadataName, AttributedModelServices.GetTypeIdentity(typeof(IFileProvider))); exportMetadata.Add(CompositionConstants.PartCreationPolicyMetadataName, CreationPolicy.Shared); batch.AddExport(new Export(ContractNames.ResourceFileProvider, exportMetadata, () => new ScopedFileProvider(resources[i].FileProvider, dirName))); // TODO export resourceTransform.Parameters into localContainer using CompositionBatch localContainer.Compose(batch); var requiredMetadata = new[] { new Tuple<string, object, IEqualityComparer>("Name", resourceTransform.Name, StringComparer.OrdinalIgnoreCase) }; ImportDefinition importDefinition = new MetadataContractBasedImportDefinition( typeof(IResourceTransform), null, requiredMetadata, ImportCardinality.ExactlyOne, false, true, CreationPolicy.NonShared); Export transformExport = localContainer.GetExports(importDefinition).Single(); transforms.Add((IResourceTransform)transformExport.Value); } } yield return new ResourceDeployment(resources[i].FileProvider, expandedSource, expandedOutput, // TODO this needs a 'writable' file provider transforms.ToArray()); } xpathContext.PopVariableScope(); } xpathContext.PopVariableScope(); }
private IEnumerable<UnitOfWork> DiscoverWork(TemplateData templateData, XPathVariable[] parameters, Resource[] resources) { CustomXsltContext xpathContext = CreateCustomXsltContext(templateData.IgnoredVersionComponent); xpathContext.PushVariableScope(templateData.Document.Root, parameters); for (int i = 0; i < resources.Length; i++) { xpathContext.PushVariableScope(templateData.Document.Root, resources[i].Variables); if (EvalCondition(xpathContext, templateData.Document.Root, resources[i].ConditionExpression)) { List<IResourceTransform> transforms = new List<IResourceTransform>(); foreach (var resourceTransform in resources[i].Transforms) { CompositionContainer paramContainer = new CompositionContainer(this._container); // TODO export resourceTransform.Parameters into paramContainer ImportDefinition importDefinition = new MetadataContractBasedImportDefinition( typeof(IResourceTransform), null, new[] {new Tuple<string, object, IEqualityComparer>("Name", resourceTransform.Name, StringComparer.OrdinalIgnoreCase) }, ImportCardinality.ExactlyOne, false, false, CreationPolicy.NonShared); Export transformExport = paramContainer.GetExports(importDefinition).Single(); transforms.Add((IResourceTransform)transformExport.Value); } yield return new ResourceDeployment(resources[i].FileProvider, resources[i].Source, resources[i].Output, // TODO this needs a 'writable' file provider transforms.ToArray()); } xpathContext.PopVariableScope(); } xpathContext.PopVariableScope(); }