当前位置: 首页 > 知识库问答 >
问题:

使用Saxon时如何停止样式表文件锁定?

东方森
2023-03-14

我用的是他用的最新版本的萨克森。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;
    }

共有1个答案

澹台承载
2023-03-14

这是一个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将忽略其属性设置为的元素。因此,您可以简单地将以下属性添加到标记中: