-1

我正在尝试为没有键或名称的节点设置属性,但它的相邻节点可以通过其name属性来识别。但我真的很难想出一个定位表达式来选择正确的节点。

源xml是:

</configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            ...
            <dependentAssembly>
                <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
            </dependentAssembly>
            ...
        </assemblyBinding>
    </runtime>
</configuration>

我试过了

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            ...
            <dependentAssembly>
                <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" xdt:Transform="SetAttributes"
                    xdt:Locator="XPath(//../assemblyIdentity[@name='System.Web.WebPages'])"/>
            </dependentAssembly>
            ...
        </assemblyBinding>
    </runtime>
</configuration>

但它不会更新节点的oldVersion属性,bindingRedirect如果我完全省略xdt:Locator="..."它,它会更改所有bindingRedirect节点的值。

更新: 使用这个在线 xpath 评估器和 Jack Fleeting 的答案,我找到了一个 xpath 表达式,它正确选择了我想要的节点

//dependentAssembly/assemblyIdentity[@name='System.Web.WebPages']/following-sibling::bindingRedirect

现在的问题似乎是转换引擎不知道如何处理这个问题。我尝试使用转换ReplaceSetAttributes,但都没有导致节点更新。有任何想法吗。

4

1 回答 1

0

如果您尝试修改 的值<bindingRedirec>,则您的 xpath 表达式不会选择它。

尝试链接

xdt:Locator="XPath(//../assemblyIdentity[@name='System.Web.WebPages'])"/>

xdt:Locator="XPath(//../assemblyIdentity[@name='System.Web.WebPages']/following-sibling::bindingRedirect)"/>

看看它是否有效。

于 2020-08-19T14:51:45.270 回答