InsertAfter的TransformXml任务 - 如何使用函数?

时间:2013-06-04 09:15:07

标签: xml xpath msbuild xdt-transform

我正在尝试在我的Web项目(.csproj / .vbproj)中使用<TransformXml>任务来转换配置文件和其他XML文件。我使用msbuild脚本(powershell)来构建和打包我的代码,并生成基于环境的转换配置和XML文件。

这一切都非常适合简单的用法,例如MatchConditionSetAttributes等,但我最近试图有点聪明并使用 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 - 所以这部分似乎导致了问题。

1 个答案:

答案 0 :(得分:2)

好的,所以这很难解决。 "InsertAfter"直接使用XPath表达式 并且不需要指定XPath函数 - 所以这是一个非常简单的修复!我会留下这个问题,因为任何人都像我一样不耐烦:)

e.g。 InsertAfter(/parent/a[last()])