2016-08-30 20 views
-1

我不能完全弄清楚我在这里做错了什么。我有一个web配置节点:使用web.config替换整个节点变换导致错误

<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> 
      .... 

,我想替换这跟:使用的MSBuild TransformXml

<dependentAssembly> 
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> 
    <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" /> 
</dependentAssembly> 

。我无法完全弄清楚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.

我缺少什么吗?

我不能改变原来的顺便说一句,这必须使用变换完成。

+0

你可以试试这个你变换 - '' – Alex

+0

这会导致错误'XmlNodeException:'/ configuration/runtime/_defaultNamespace:assemblyBinding/_defaultNamespace:dependentAssembly [./_ defaultNamespace:assemblyIdentity/@ name ='Newtonsoft.Js on']'有一个无效的标记。“@alex。谢谢 – Liam

+0

嗯,唯一的地方,我可以找到你最初得到的错误是 - https://github.com/micahlmartin/XmlTransformer/blob/master/src/XmlTransformer/XmlElementContext.cs#L292 - 这是第三方解析器...? – Alex

回答

2

属性name='Newtonsoft.Json'位于父元素assemblyIdentity,所以我不知道为什么param/@name。正确的XPath表达式来测试,如果子元素命名-ignoring namespaces-“assemblyIdentity”有属性name值等于“Newtonsoft.Json”是如下:

xdt:Locator="Condition(*[local-name()='assemblyIdentity']/@name='Newtonsoft.Json')" 
+0

就是这样。 XPath不是我强大的TBH。谢谢 – Liam