使用 web.config 转换替换整个节点导致错误
Replacing entire node using web.config transforms resulting in error
我不太明白我做错了什么。我在网络配置中有一个节点:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
....
我想将替换为:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
使用 MsBuild TransformXml
。不过,我不太清楚 xdt 属性的正确语法。以下(在我看来是正确的):
<dependentAssembly xdt:Transform="Replace"
xdt:Locator="Condition(param/@name='Newtonsoft.Json'">
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
导致错误:
XmlNodeException : Transform and Locator attributes must contain only
a type name, or a type name followed by a list of attributes in
parentheses.
我在这里错过了什么?
我不能改变原来的顺便说一句,这必须使用转换来完成。
属性 name='Newtonsoft.Json'
位于名为 assemblyIdentity
的父元素中,所以我不确定为什么 param/@name
。用于测试名为 -ignoring namespaces- 'assemblyIdentity' 的子元素是否具有属性 name
值等于 'Newtonsoft.Json' 的正确 XPath 表达式如下:
xdt:Locator="Condition(*[local-name()='assemblyIdentity']/@name='Newtonsoft.Json')"
问题基本上就是名字space。
在您的 xdt 文件中定义此名称space。
<configuration xmlns:asm="urn:schemas-microsoft-com:asm.v1" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
像这样使用新名称space:
<asm:assemblyBinding>
<asm:dependentAssembly xdt:Transform="Replace" xdt:Locator="Condition(asm:assemblyIdentity/@name='Newtonsoft.Json')" >
<asm:assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<asm:bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</asm:dependentAssembly>
</asm:assemblyBinding>
我认为这比 local-name() 版本更优雅。
我不太明白我做错了什么。我在网络配置中有一个节点:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
....
我想将替换为:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
使用 MsBuild TransformXml
。不过,我不太清楚 xdt 属性的正确语法。以下(在我看来是正确的):
<dependentAssembly xdt:Transform="Replace"
xdt:Locator="Condition(param/@name='Newtonsoft.Json'">
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
导致错误:
XmlNodeException : Transform and Locator attributes must contain only a type name, or a type name followed by a list of attributes in parentheses.
我在这里错过了什么?
我不能改变原来的顺便说一句,这必须使用转换来完成。
属性 name='Newtonsoft.Json'
位于名为 assemblyIdentity
的父元素中,所以我不确定为什么 param/@name
。用于测试名为 -ignoring namespaces- 'assemblyIdentity' 的子元素是否具有属性 name
值等于 'Newtonsoft.Json' 的正确 XPath 表达式如下:
xdt:Locator="Condition(*[local-name()='assemblyIdentity']/@name='Newtonsoft.Json')"
问题基本上就是名字space。 在您的 xdt 文件中定义此名称space。
<configuration xmlns:asm="urn:schemas-microsoft-com:asm.v1" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
像这样使用新名称space:
<asm:assemblyBinding>
<asm:dependentAssembly xdt:Transform="Replace" xdt:Locator="Condition(asm:assemblyIdentity/@name='Newtonsoft.Json')" >
<asm:assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<asm:bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</asm:dependentAssembly>
</asm:assemblyBinding>
我认为这比 local-name() 版本更优雅。