我试图在我的web项目(.csproj/.vbproj)中使用<TransformXml>
任务来转换配置文件和其他XML文件。我使用msbuild脚本(powershell)来构建和打包代码,并生成基于环境的转换配置和XML文件。
这对于Match
, Condition
, SetAttributes
等简单用法都可以完美地工作,但我最近尝试了一点聪明,并使用XPath定位器在一组节点中查找最后一个节点,以便仅设置最后一个节点的属性。此外,我想在最后一个节点之后插入一个新节点,并带有一些额外的属性。
尝试此语法时:
<parent>
<a xdt:Transform="SetAttributes(from)" xdt:Locator="XPath(/a[ancestor-or-self::section[last()]])" from="20130522" />
<a xdt:Transform="SetAttributes(to)" xdt:Locator="XPath(/a[ancestor-or-self::section[last()]])" to="20130630" />
<a xdt:Transform="InsertAfter(XPath(/a[ancestor-or-self::section[last()]]))" from="20130701" to="20140101" />
</parent>
上的XML(缩短)看起来大致如下:
<parent>
<a from="xxx1" to="yyy1">
<one>one</one>
<two>two</two>
</a>
<a from="xxx2" to="yyy2">
<one>one</one>
<two>two</two>
</a>
<a from="xxx3" to="yyy3">
<one>one</one>
<two>two</two>
</a>
</parent>
…我得到了熟悉的(和预期的)错误
Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.
我能找到的所有答案都围绕着使用代码来指定命名空间管理器,这非常有意义-但是我没有这个过程的代码,它都在TransformXml
任务和普通XML的范围内。我不知道XPath查询的哪个部分导致这个错误发生,也不知道如何指定需要运行的任务类型。
我怎样才能做到这一点?甚至可以在转换中进行这种类型的节点操作吗?
感谢编辑:我现在可以看到错误发生在InsertAfter调用而不是SetAttributes -所以这部分似乎是导致问题的
好了,这很容易解决。"InsertAfter"
直接接受XPath表达式,不需要指定XPath函数——所以这是一个非常简单的修复!我将把这个问题留到后面,以防有人像我一样没有耐心。
。InsertAfter(/parent/a[last()])