【问题标题】:MsBuild XmlPeek result splitting valuesMsBuild XmlPeek 结果拆分值
【发布时间】:2014-07-23 09:13:00
【问题描述】:

在我的 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' == 'Debug.v9|AnyCPU'
'发布 |AnyCPU' == 'Debug.v10|AnyCPU'
'发布 |AnyCPU' == 'Debug.v101|AnyCPU'

现在我需要在'==' 上拆分这些,我很困惑如何在拆分字符串时创建另一个ItemGroup 或PropertyGroup。

%(Peeked.Identity).Split('==') 什么都不做。

问题 1:如何在此 ItemGroup 上使用 Split 并拆分其所有值?
问题 2:另外,是否可以拆分XmlPeek 中使用的来自 XQuery 的值?

【问题讨论】:

    标签: c# xml msbuild split


    【解决方案1】:

    XmlPeek 任务不允许执行附加的 Xslt 函数。不幸的是,msbuild 中没有内置的字符串函数。

    我有两种解决方案:一种使用 amn XslTranformation,另一种使用 Exec 的命令。

    XslTransform

    您可以使用XslTransformation 任务获取您的构建文件并利用substring-before 和substring-after xslt 函数对其进行转换。输出存储在一个文件中(在我的例子中是 test-xslt.out),并使用 ReadLinesfromFile 读取并转换为 Items。

    有一个警告:在这种情况下,变量不会被替换,而对于 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>
    

    命令执行

    此解决方案将您的 Peeked 值写入文件。通过调用命令处理器的 FOR /F 命令,我们可以解析行并将它们分割在一些非常适合这里的严格边界内。 EXEC 的输出被写入文件 split.txt。 ReadLinesFromFiles 用于读取 Item 中的值。

     <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)" />
    

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      相关资源
      最近更新 更多