remove namespace xdt did not work
chucklu opened this issue · 2 comments
I have base.xml and target.xml, and I want to apply the target to base.
1.base.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings>
<add key="test20180523" value="1" />
</appSettings>
</configuration>
2.target.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appSettings>
<add key="test20180523" value="1" />
</appSettings>
</configuration>
3.patch file
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0" xdt:Transform="RemoveAttributes(xmlns)" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" />
4.nothing happened when I apply the patch to the source.
It seems like a bug in Microsoft.Web.XmlTransform, I will look into it.
the log info I got from Microsoft.Web.XmlTransform
Executing RemoveAttributes (transform line 1, 76)
on /_defaultNamespace:configuration
Applying to 'configuration' element (source line 2, 2)
patch20180523104824805.config (1, 76) warning: Argument 'xmlns' did not match any attributes
base.xml (2, 2) warning: No attributes found to remove
Done executing RemoveAttributes
I have found bug in AttributeTransform class of Microsoft.Web.Xdt
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(SR.XMLTRANSFORMATION_TransformArgumentFoundNoAttributes, arguments[0]);
}
}
return attributes;
}
XmlNodeList attributes = node.SelectNodes(xpath);
The SelectNodes did not consider the node could have xmlnamespace.