在我的msbuild脚本(.proj)中,我正在使用xmlpeek查询c项目的生成配置,并获取PropertyGroup
的condition属性值。以下是工作代码:
<Target Name="xPeek">
<XmlPeek Namespaces="<Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
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'
现在我需要在
'=='
上拆分这些字符串,我在这里很困惑如何在拆分字符串时创建另一个ItemGroup
或PropertyGroup
。什么也不做。
问题1:如何在拆分其所有值的同时对这个
%(Peeked.Identity).Split('==')
使用split?问题2:另外,是否可以从xmlpeek中使用的xquery中获取拆分的值?
最佳答案
xmlpeek任务不允许执行附加的xslt函数。很遗憾,msbuild中没有内置字符串函数。
我有两个解决方案给您:一个使用amn xsltranformation,另一个使用命令的exec。
XSLT变换
您可以使用XslTransformation任务获取构建文件,并利用substring-before和substring-afterxslt函数对其运行转换。输出存储在一个文件(在我的例子中是test-xslt.out)中,并使用ReadLinesfromFile读取并转换为项。
有一点需要注意:在这个场景中,变量不会被替换,而对于xmlpeek,它们是被替换的。
safexml编码的版本如下:
<XslTransformation XmlInputPaths = "test-xslttrans.csproj"
XslContent="
<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> "
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 "tokens=1* delims==" %%a in (test-xslt-write.out) do @echo %%a > split.txt"/>
<Exec Command="for /f "tokens=1* delims==" %%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/