| File: XmlAttributeTransform.cs | Web Access |
| Project: src\xdt\src\Microsoft.Web.XmlTransform\Microsoft.Web.XmlTransform.csproj (Microsoft.Web.XmlTransform) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.Diagnostics; using Microsoft.Web.XmlTransform.Properties; namespace Microsoft.Web.XmlTransform { public abstract class AttributeTransform : Transform { #region private data members private XmlNode transformAttributeSource = null; private XmlNodeList transformAttributes = null; private XmlNode targetAttributeSource = null; private XmlNodeList targetAttributes = null; #endregion protected AttributeTransform() : base(TransformFlags.ApplyTransformToAllTargetNodes) { } protected XmlNodeList TransformAttributes { get { if (transformAttributes == null || transformAttributeSource != TransformNode) { transformAttributeSource = TransformNode; transformAttributes = GetAttributesFrom(TransformNode); } return transformAttributes; } } protected XmlNodeList TargetAttributes { get { if (targetAttributes == null || targetAttributeSource != TargetNode) { targetAttributeSource = TargetNode; targetAttributes = GetAttributesFrom(TargetNode); } return targetAttributes; } } private XmlNodeList GetAttributesFrom(XmlNode node) { if (Arguments == null || Arguments.Count == 0) { return GetAttributesFrom(node, "*", false); } else if (Arguments.Count == 1) { return GetAttributesFrom(node, Arguments[0], true); } else { // First verify all the arguments foreach (string argument in Arguments) { GetAttributesFrom(node, argument, true); } // Now return the complete XPath and return the combined list return GetAttributesFrom(node, Arguments, false); } } private XmlNodeList GetAttributesFrom(XmlNode node, string argument, bool warnIfEmpty) { return GetAttributesFrom(node, new string[1] { argument }, warnIfEmpty); } private XmlNodeList GetAttributesFrom(XmlNode node, IList<string> arguments, bool warnIfEmpty) { string[] array = new string[arguments.Count]; arguments.CopyTo(array, 0); string xpath = String.Concat("@", String.Join("|@", array)); XmlNodeList attributes = node.SelectNodes(xpath); if (attributes.Count == 0 && warnIfEmpty) { Debug.Assert(arguments.Count == 1, "Should only call warnIfEmpty==true with one argument"); if (arguments.Count == 1) { Log.LogWarning(Resources.XMLTRANSFORMATION_TransformArgumentFoundNoAttributes, arguments[0]); } } return attributes; } } }