0

我无法弄清楚我在这里做错了什么。我在网络配置中有一个节点:

<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 和 Locator 属性必须仅包含类型名称,或类型名称后跟括号中的属性列表。

我在这里想念什么?

我不能改变原来的 BTW,这必须使用转换来完成。

4

2 回答 2

3

属性name='Newtonsoft.Json'位于名为 的父元素中assemblyIdentity,所以我不确定为什么param/@name。用于测试名为 -ignoring namespaces- 'assemblyIdentity' 的子元素是否具有name等于 'Newtonsoft.Json' 的属性值的正确 XPath 表达式如下:

xdt:Locator="Condition(*[local-name()='assemblyIdentity']/@name='Newtonsoft.Json')"
于 2016-08-30T10:09:47.070 回答
0

问题基本上是名称空间。在您的 xdt 文件中定义此命名空间。

<configuration xmlns:asm="urn:schemas-microsoft-com:asm.v1" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

像这样使用新的命名空间:

<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() 版本更优雅。

于 2020-01-16T09:03:26.717 回答