XSL转换期间出错:禁止执行'document()'函数

时间:2015-10-08 13:16:42

标签: msbuild visual-studio-2015

调用XslTransformation任务时,我在msbuild v14 / vs2015中遇到问题。

错误MSB3703:无法执行转换。禁止执行'document()'功能。使用XsltSettings.EnableDocumentFunction属性启用它。

是的,我在xslt转换中调用了xsl document()函数。
从vs2013和之前版本的msbuild运行相同的任务时,我没有任何错误。
我这里不使用任何C#代码,所以我不能设置EnableDocumentFunction属性,我不想删除我的document()调用。
我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

UseTrustedSettings参数添加到XslTransformation任务中:
<XslTransformation ... UseTrustedSettings="true" />

为了能够使用以前版本的VS打开项目,您可以使用以下条件
<XslTransformation ... UseTrustedSettings="true" Condition="$(MSBuildToolsVersion) &gt; 13" /> <XslTransformation ... Condition="$(MSBuildToolsVersion) &lt;= 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) &gt; 13"" />" & vbCrLf & "$1 Condition=""$(MSBuildToolsVersion) &lt;= 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

我在这里分享这个,因为它可能对其他人有用,但请先备份,或者如果您使用的是存储库,请在提交之前查看更改。这个脚本应该是幂等的,因为如果它运行两次,它不会改变同一个文件两次。