我用的是他用的最新版本的萨克森。NET(9.7.0.18),我发现我的样式表文件被锁定了。这个问题并不总是立即出现,但我通常会在多次调用样式表后看到这个问题。此时,我将无法再通过文本编辑器保存对相关样式表的更改,直到我回收应用程序池。
从我目前看到的情况来看,支持样式表通过xsl:导入或xsl:包括被锁定,但是顶级样式表没有被锁定。
我能够通过创建一个新的MVC项目并调用以下GetXslt2FO方法来重现该问题。当使用. NET XslCompiledTransform时,我看不到这个问题。
如何阻止文件表锁发生?
下面是我的示例代码:
public XsltExecutable GetExecutable(string stylesheetPath)
{
using (FileStream s = new FileStream(stylesheetPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
compiler.BaseUri = new Uri(stylesheetPath);
var executable = compiler.Compile(s);
return executable;
}
}
public string GetXslt2FO(string xsltFilePath, XDocument xml, Dictionary<string, string> args)
{
// Compile stylesheet
var executable = GetExecutable(xsltFilePath);
var declaredArgs = executable.GetGlobalParameters();
// Do transformation to a destination
var destination = new DomDestination();
using (var inputStream = new MemoryStream())
{
xml.Save(inputStream);
inputStream.Position = 0;
var transformer = executable.Load();
FileInfo stylesheetFileInfo = new FileInfo(xsltFilePath);
transformer.SetInputStream(inputStream, new Uri(stylesheetFileInfo.DirectoryName));
foreach (var arg in args)
{
var matchingArgDeclaration = declaredArgs.FirstOrDefault(a => a.Key.LocalName.ToLower() == arg.Key.ToLower());
if (matchingArgDeclaration.Key == null)
{
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(arg.Value));
}
else
{
// try to load up the specific parameter type
// list is based on http://www.saxonica.com/documentation/#!dotnetdoc/Saxon.Api/XdmAtomicValue
XdmItemType argType = matchingArgDeclaration.Value.getDeclaredItemType();
var argTypeName = "";
if (argType != null &&
argType is XdmAtomicType)
argTypeName = ((XdmAtomicType)argType).Name.LocalName;
switch (argTypeName.ToLower())
{
case "boolean":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToBoolean(arg.Value)));
break;
case "integer":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToInt32(arg.Value)));
break;
case "decimal":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDecimal(arg.Value)));
break;
case "float":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToSingle(arg.Value)));
break;
case "double":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDouble(arg.Value)));
break;
case "anyuri":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new Uri(arg.Value)));
break;
case "qname":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new QName(arg.Value)));
break;
default:
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(((arg.Value))));
break;
}
}
}
transformer.Run(destination);
}
return destination.XmlDocument.OuterXml;
}
这是一个Saxon错误,已在维护版本9.8.0.2中修复。谢谢你的报道。
我有一个用这个Saxon命令创建的编译样式表: java net。旧金山。撒克逊人。编译[选项]样式表输出[参数…] 现在,我想将这个样式表应用到我的Java代码中的XML树。是否可以使用JAXP应用编程接口来实现这一点,如果可以,具体如何实现?在此之前,非常感谢您的任何帮助。
问题内容: 我用Sax解析了一个大的xml文档,当某些条件建立时,我想停止解析该文档吗?怎么做? 问题答案: 创建SAXException的特殊化并将其抛出(您不必创建自己的特殊化,但这意味着您可以自己专门捕获它,并将其他SAXExceptions视为实际错误)。
我有一个类似于聊天轮盘的应用程序,其中用户是随机匹配的。我在数据库级别通过将两个用户与 匹配来执行此操作 然而,如果用户A正在等待,而用户B和C同时继续,这就容易受到攻击。 有没有办法锁定记录,以便在进行查询时无法读取它?就像如果用户 B 首先进行 查询(这将返回用户 A),我希望相同的查询不为用户 C 返回任何内容。 我在看这个:https://www . PostgreSQL . org/do
我正在使用python创建一个控制Tkinter窗口的类对象。我的代码如下所示: 我希望能够启动一个类的实例,然后像这样停止它: 一切正常,窗口在上成功创建,单击按钮并执行时窗口消失。问题是主循环继续运行。我必须使用Ctrl C手动杀死程序,它显示它在。 如果我只是在一个普通的文件中而不是在一个类中执行所有tkinter代码,那么一切都是一样的,但是当我在root上调用destroy时,mainl
我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。
问题内容: 是否可以指示jQuery Mobile不要设置我的输入框和提交按钮的样式。我自定义CSS很好。jQuery移动脚本正在将自己的样式应用于所有元素。 我尝试过的一种解决方法是覆盖自定义CSS中的那些元素。我可以在其中执行其他任何功能吗?像这样的东西 问题答案: jQuery Mobile将忽略其属性设置为的元素。因此,您可以简单地将以下属性添加到标记中: