在我的msbuild脚本(.proj)中,我正在使用xmlpeek查询c项目的生成配置,并获取PropertyGroup的condition属性值。以下是工作代码:

      <Target Name="xPeek">
    <XmlPeek Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath=" D:\source\MyProject.csproj"
             Query="/msb:Project/msb:PropertyGroup[contains(@Condition,'Debug')]/@Condition">
      <Output TaskParameter="Result" ItemName="Peeked" />
    </XmlPeek>

   <Message Text="%(Peeked.Identity)" />
  </Target>

这里是输出:
'释放anycpu'='调试anycpu'
'释放anycpu'='调试.v9 anycpu'
'释放anycpu'='调试.v10 anycpu'
'释放anycpu'='调试.v101 anycpu'
现在我需要在'=='上拆分这些字符串,我在这里很困惑如何在拆分字符串时创建另一个ItemGroupPropertyGroup
什么也不做。
问题1:如何在拆分其所有值的同时对这个%(Peeked.Identity).Split('==')使用split?
问题2:另外,是否可以从xmlpeek中使用的xquery中获取拆分的值?

最佳答案

xmlpeek任务不允许执行附加的xslt函数。很遗憾,msbuild中没有内置字符串函数。
我有两个解决方案给您:一个使用amn xsltranformation,另一个使用命令的exec。
XSLT变换
您可以使用XslTransformation任务获取构建文件,并利用substring-beforesubstring-afterxslt函数对其运行转换。输出存储在一个文件(在我的例子中是test-xslt.out)中,并使用ReadLinesfromFile读取并转换为项。
有一点需要注意:在这个场景中,变量不会被替换,而对于xmlpeek,它们是被替换的。
safexml编码的版本如下:

   <XslTransformation XmlInputPaths = "test-xslttrans.csproj"
      XslContent="
&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;
    xmlns:msb=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;
&gt;
   &lt;xsl:output method=&quot;text&quot; indent=&quot;yes&quot; /&gt;

  &lt;xsl:template match=&quot;text()|@*&quot;/&gt;

  &lt;xsl:template match=&quot;/msb:Project/msb:PropertyGroup[contains(@Condition,'Debug')]&quot;&gt;
&lt;xsl:value-of select=&quot;substring-before(@Condition,'==')&quot;/&gt;
&lt;xsl:text&gt;
&lt;/xsl:text&gt;
&lt;xsl:value-of select=&quot;substring-after(@Condition,'==')&quot;/&gt;
&lt;xsl:text&gt;
&lt;/xsl:text&gt;
  &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;   "
      OutputPaths = "test-xslt.out">

    </XslTransformation>

    <ReadLinesFromFile
              File="test-xslt.out" >
              <Output
                  TaskParameter="Lines"
                  ItemName="SplittedPeek"/>
    </ReadLinesFromFile>

    <Message Text="%(SplittedPeek.Identity)" />

为了方便起见,这里是简单的xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003">

  <xsl:output method="text" indent="yes" />
  <xsl:template match="text()|@*"/>
  <xsl:template match="/msb:Project/msb:PropertyGroup[contains(@Condition,'Debug')]" >
<xsl:value-of select="substring-before(@Condition,'==')"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="substring-after(@Condition,'==')"/>
<xsl:text>
</xsl:text>
  </xsl:template>
</xsl:stylesheet>

命令执行程序
此解决方案将您的窥视值写入文件。通过调用命令处理器的for/f commamnd,我们可以解析行并在一些严格的边界内拆分它们,这些边界非常适合这里。exec的输出被写入split.txt文件。readlinesfromfiles用于读取项目中的值。
 <WriteLinesToFile
          File="test-xslt-write.out"
          Lines="@(Peeked)"
          Overwrite="true"
          Encoding="ASCII"/>

 <Exec Command="for /f &quot;tokens=1* delims==&quot; %%a in (test-xslt-write.out) do @echo %%a > split.txt"/>
 <Exec Command="for /f &quot;tokens=1* delims==&quot; %%a in (test-xslt-write.out) do @echo %%b >> split.txt"/>

<ReadLinesFromFile
          File="test-xslt.out" >
          <Output
              TaskParameter="Lines"
              ItemName="SplittedCmdPeek"/>
</ReadLinesFromFile>

<Message Text="%(SplittedCmdPeek.Identity)" />

关于c# - MsBuild XmlPeek结果分割值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24906430/

10-10 19:40