调用XslTransformation任务时,我在msbuild v14 / vs2015中遇到问题。
错误MSB3703:无法执行转换。禁止执行'document()'功能。使用XsltSettings.EnableDocumentFunction属性启用它。
是的,我在xslt转换中调用了xsl document()函数。
从vs2013和之前版本的msbuild运行相同的任务时,我没有任何错误。
我这里不使用任何C#代码,所以我不能设置EnableDocumentFunction属性,我不想删除我的document()调用。
我该如何解决这个问题?
答案 0 :(得分:8)
将UseTrustedSettings参数添加到XslTransformation
任务中:
<XslTransformation ... UseTrustedSettings="true" />
为了能够使用以前版本的VS打开项目,您可以使用以下条件:
<XslTransformation ... UseTrustedSettings="true" Condition="$(MSBuildToolsVersion) > 13" />
<XslTransformation ... Condition="$(MSBuildToolsVersion) <= 13" />
可以找到更多详细信息here。
答案 1 :(得分:0)
根据上面接受的答案,我编写了以下LINQPad(VB语句)脚本,对指定的Projects文件夹下的所有wixproj
文件进行适当的调整,以便可以使用旧的和较新版本的msbuild
:
Const projectsFolder As String = "C:\Projects"
Dim projects = IO.Directory.EnumerateFiles(projectsFolder, "*.wixproj", SearchOption.AllDirectories)
Dim rXform As New System.Text.RegularExpressions.RegEx("(?m)(^.*\<XslTransformation .*(?=\s\/\>))")
Dim replaceText = "$1 UseTrustedSettings=""true"" Condition=""$(MsBuildToolsVersion) > 13"" />" & vbCrLf & "$1 Condition=""$(MSBuildToolsVersion) <= 13"""
For Each f In projects
Dim contents = IO.File.ReadAllText(f)
If Not contents.Contains("UseTrustedSettings=""true""") Then
Dim replaced = rXform.Replace(contents, replaceText)
If Not String.Equals(contents, replaced) Then
IO.File.WriteAllText(f, replaced)
String.Format("File touched: {0}", f).Dump()
End If
End If
Next
我在这里分享这个,因为它可能对其他人有用,但请先备份,或者如果您使用的是存储库,请在提交之前查看更改。这个脚本应该是幂等的,因为如果它运行两次,它不会改变同一个文件两次。