XSL 转换期间出错:'document()' 函数的执行被禁止
error during XSL Transformation : Execution of the 'document()' function was prohibited
调用 XslTransformation 任务时,我在 msbuild v14/vs2015 中遇到问题。
错误 MSB3703:无法执行转换。禁止执行 'document()' 函数。使用 XsltSettings.EnableDocumentFunction 属性 启用它。
是的,我在 xslt 转换中调用了 xsl document() 函数..
当 运行 来自 vs2013 和以前版本的 msbuild 的相同任务时,我没有任何错误..
我在这里没有使用任何 C# 代码,所以我无法设置 EnableDocumentFunction 属性 并且我不想删除我的 document() 调用。
我该如何解决这个问题?
将UseTrustedSettings参数添加到XslTransformation
任务:
<XslTransformation ... UseTrustedSettings="true" />
为了能够使用以前版本的VS打开项目,可以使用以下条件:
<XslTransformation ... UseTrustedSettings="true" Condition="$(MSBuildToolsVersion) > 13" />
<XslTransformation ... Condition="$(MSBuildToolsVersion) <= 13" />
可以找到更多详细信息 here。
基于上面接受的答案,我编写了以下 LINQPad(VB 语句)脚本来对指定项目文件夹下的所有 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 = " UseTrustedSettings=""true"" Condition=""$(MsBuildToolsVersion) > 13"" />" & vbCrLf & " 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
我在这里分享它,因为它可能对其他人有用,但请先进行备份,或者如果您使用的是存储库,请在提交前检查更改。这个脚本应该是幂等的,因为如果 运行 两次,它不会改变同一个文件两次。
调用 XslTransformation 任务时,我在 msbuild v14/vs2015 中遇到问题。
错误 MSB3703:无法执行转换。禁止执行 'document()' 函数。使用 XsltSettings.EnableDocumentFunction 属性 启用它。
是的,我在 xslt 转换中调用了 xsl document() 函数..
当 运行 来自 vs2013 和以前版本的 msbuild 的相同任务时,我没有任何错误..
我在这里没有使用任何 C# 代码,所以我无法设置 EnableDocumentFunction 属性 并且我不想删除我的 document() 调用。
我该如何解决这个问题?
将UseTrustedSettings参数添加到XslTransformation
任务:
<XslTransformation ... UseTrustedSettings="true" />
为了能够使用以前版本的VS打开项目,可以使用以下条件:
<XslTransformation ... UseTrustedSettings="true" Condition="$(MSBuildToolsVersion) > 13" />
<XslTransformation ... Condition="$(MSBuildToolsVersion) <= 13" />
可以找到更多详细信息 here。
基于上面接受的答案,我编写了以下 LINQPad(VB 语句)脚本来对指定项目文件夹下的所有 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 = " UseTrustedSettings=""true"" Condition=""$(MsBuildToolsVersion) > 13"" />" & vbCrLf & " 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
我在这里分享它,因为它可能对其他人有用,但请先进行备份,或者如果您使用的是存储库,请在提交前检查更改。这个脚本应该是幂等的,因为如果 运行 两次,它不会改变同一个文件两次。