0

<TransformXml>Web プロジェクト (.csproj/.vbproj) でタスクを使用して、構成ファイルやその他の 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 クエリのどの部分でこのエラーが発生するのか、または実行する必要があるタスクの種類を指定する方法がわかりません。

どうすればこれを達成できますか? トランスフォーム内でこのタイプのノード操作を行うことさえ可能ですか?

ありがとう

編集: SetAttributes ではなく、InsertAfter 呼び出しでエラーが発生していることがわかったので、この部分が問題を引き起こしているようです。

4

1 に答える 1

2

わかりましたので、これは簡単に解決できました。"InsertAfter"XPath 式を直接受け取り、 XPath 関数を指定する必要がないため、これは非常に簡単な修正でした。誰かが私と同じくらいせっかちな場合に備えて、この質問はそのままにしておきます:)

例えばInsertAfter(/parent/a[last()])

于 2013-06-05T06:29:01.777 に答える