首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何让Saxon XSLT处理器向stderr或log4j报告错误?

Saxon XSLT处理器是一个功能强大的XSLT和XQuery处理器,用于XML文档的转换和查询。它提供了多种方式来报告错误,包括向stderr或log4j输出错误信息。

要让Saxon XSLT处理器向stderr报告错误,可以使用Java的System类的标准错误输出流(System.err)。在Java代码中,可以通过捕获Saxon的异常并将错误信息输出到标准错误流来实现。以下是一个示例代码:

代码语言:txt
复制
import net.sf.saxon.s9api.*;

public class XSLTProcessor {
    public static void main(String[] args) {
        try {
            Processor processor = new Processor(false);
            XsltCompiler compiler = processor.newXsltCompiler();
            XsltExecutable executable = compiler.compile(new StreamSource("input.xsl"));
            XsltTransformer transformer = executable.load();
            
            // 设置错误监听器,将错误信息输出到标准错误流
            transformer.setErrorListener(new StandardErrorListener());
            
            // 设置输入和输出
            transformer.setSource(new StreamSource("input.xml"));
            transformer.setDestination(new StreamResult("output.xml"));
            
            // 执行转换
            transformer.transform();
        } catch (SaxonApiException e) {
            e.printStackTrace();
        }
    }
}

class StandardErrorListener implements ErrorListener {
    @Override
    public void error(XdmNode node, QName qname, org.xml.sax.SAXParseException exception) throws XPathException {
        System.err.println("Error: " + exception.getMessage());
    }

    @Override
    public void fatalError(XdmNode node, QName qname, org.xml.sax.SAXParseException exception) throws XPathException {
        System.err.println("Fatal Error: " + exception.getMessage());
    }

    @Override
    public void warning(XdmNode node, QName qname, org.xml.sax.SAXParseException exception) throws XPathException {
        System.err.println("Warning: " + exception.getMessage());
    }
}

上述代码中,我们创建了一个StandardErrorListener类来实现Saxon的ErrorListener接口,并重写了error、fatalError和warning方法,将错误信息输出到标准错误流。

要让Saxon XSLT处理器向log4j报告错误,可以使用log4j日志框架来记录错误信息。首先,需要在项目中引入log4j的相关依赖。然后,可以通过配置log4j.properties文件来指定日志输出的方式和位置。以下是一个示例的log4j.properties配置文件:

代码语言:txt
复制
# 设置日志输出级别
log4j.rootLogger=ERROR, console

# 配置控制台输出
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

在Java代码中,可以使用log4j的Logger类来记录错误信息。以下是一个示例代码:

代码语言:txt
复制
import net.sf.saxon.s9api.*;

import org.apache.log4j.Logger;

public class XSLTProcessor {
    private static final Logger logger = Logger.getLogger(XSLTProcessor.class);

    public static void main(String[] args) {
        try {
            // 配置log4j
            PropertyConfigurator.configure("log4j.properties");

            Processor processor = new Processor(false);
            XsltCompiler compiler = processor.newXsltCompiler();
            XsltExecutable executable = compiler.compile(new StreamSource("input.xsl"));
            XsltTransformer transformer = executable.load();

            // 设置错误监听器,将错误信息记录到log4j日志
            transformer.setErrorListener(new Log4jErrorListener());

            // 设置输入和输出
            transformer.setSource(new StreamSource("input.xml"));
            transformer.setDestination(new StreamResult("output.xml"));

            // 执行转换
            transformer.transform();
        } catch (SaxonApiException e) {
            logger.error("Error: " + e.getMessage());
        }
    }
}

class Log4jErrorListener implements ErrorListener {
    private static final Logger logger = Logger.getLogger(Log4jErrorListener.class);

    @Override
    public void error(XdmNode node, QName qname, org.xml.sax.SAXParseException exception) throws XPathException {
        logger.error("Error: " + exception.getMessage());
    }

    @Override
    public void fatalError(XdmNode node, QName qname, org.xml.sax.SAXParseException exception) throws XPathException {
        logger.error("Fatal Error: " + exception.getMessage());
    }

    @Override
    public void warning(XdmNode node, QName qname, org.xml.sax.SAXParseException exception) throws XPathException {
        logger.warn("Warning: " + exception.getMessage());
    }
}

上述代码中,我们创建了一个Log4jErrorListener类来实现Saxon的ErrorListener接口,并使用log4j的Logger类来记录错误信息。在XSLTProcessor类的main方法中,我们首先通过PropertyConfigurator.configure方法加载log4j.properties配置文件,然后创建Logger实例。在捕获Saxon的异常时,使用logger.error方法将错误信息记录到log4j日志中。

这样,无论是向stderr还是log4j报告错误,我们都可以根据实际需求选择适合的方式来记录和处理错误信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

执行XSLT转换

XSLT(Extensible StyleSheet Language Transformations,可扩展样式表语言转换)是一种基于XML的语言,用于描述如何将给定的XML文档转换为另一个XML其他...Saxon处理器支持XSLT 2.0。%XML.XSLT2程序包为该处理器提供API。XML.XSLT2 API通过到XSLT 2.0网关的连接Saxon发送请求。网关允许多个连接。...要执行XSLT转换,请执行以下操作:如果使用的是Saxon处理器,请按照下一节所述配置XSLT网关服务器。使用默认配置。如果使用的是Xalan处理器,则不需要网关。系统会在需要时自动启动网关。...配置、启动和停止XSLT 2.0网关当使用Saxon处理器(执行XSLT 2.0转换)时, IRIS使用XSLT 2.0网关(后者使用Java)。...重用XSLT网关服务器连接(XSLT 2.0)如果使用的是Saxon处理器,InterSystems IRIS将使用之前配置的XSLT 2.0网关。

3.3K20

添加和使用XSLT扩展函数

自定义错误处理当出现错误时,XSLT处理器(XalanSaxon)执行当前错误处理程序的error()方法,将消息作为参数发送到该方法。...类似地,当发生致命错误警告时,XSLT处理器会根据需要执行datalError()Warning()方法。对于所有这三种方法,默认行为是将消息写入当前设备。...要自定义错误处理,请执行以下操作:对于XalanSaxon处理器,在创建%XML.XSLT.ErrorHandler的子类。...扩展函数可以在InterSystems IRIS中创建XSLT扩展函数,然后在样式表中使用它们,如下所示:对于XSLT2.0(Saxon处理器),可以使用名称空间com.intersystems.xsltgateway.XSLTGateway...要添加和使用XSLT扩展函数,请执行以下操作:对于XalanSaxon处理器,在创建%XML.XSLT.CallbackHandler的子类。在这个子类中,根据需要实现evaluate()方法。

4.3K20
  • Java XML和JSON:Java SE的文档处理,第1部分

    首先,我将您展示如何覆盖Xalan,它是Java 11的标准XSLT实现,具有XSLT 2.0+和XPath 2.0 +兼容的替代方案,在本例中为SAXON。...使用SAXON for XSLT / XPath可以更轻松地访问分组等功能,我还将演示。接下来,我将您展示使用Jackson将XML转换为JSON的两种方法:第一种技术是数据绑定,第二种是树遍历。...第6章介绍了如何使用SAXON超越XSLT / XPath 1.0。 第11章是探索杰克逊的一个新的(冗长的)章节。 第12章是探索JSON-P的新(冗长)章节。...第6章附录:使用XSLT转换XML文档 使用SAXON超越XSLT / XPath 1.0 Java 11的XSLT实现基于Apache Xalan Project,它支持XSLT 1.0和XPath...Java XML和JSON,第6章介绍了如何使用SAXON覆盖Xalan,然后验证是否正在使用SAXON

    5.6K30

    Java XML和JSON:Java SE的文档处理,第1部分

    首先,我将您展示如何覆盖Xalan,它是Java 11的标准XSLT实现,具有XSLT 2.0+和XPath 2.0 +兼容的替代方案,在本例中为SAXON。...使用SAXON for XSLT / XPath可以更轻松地访问分组等功能,我还将演示。接下来,我将您展示使用Jackson将XML转换为JSON的两种方法:第一种技术是数据绑定,第二种是树遍历。...第6章介绍了如何使用SAXON超越XSLT / XPath 1.0。 第11章是探索杰克逊的一个新的(冗长的)章节。 第12章是探索JSON-P的新(冗长)章节。...第6章附录:使用XSLT转换XML文档 使用SAXON超越XSLT / XPath 1.0 Java 11的XSLT实现基于Apache Xalan Project,它支持XSLT 1.0和XPath...Java XML和JSON,第6章介绍了如何使用SAXON覆盖Xalan,然后验证是否正在使用SAXON

    6.3K10

    XML 相关漏洞风险研究

    当不同的文档不同的组织使用相同的名称但定义不同的元素时,通过为元素和属性名提供一个命名空间,可以明确它们的身份和范围。 XML命名空间通过在元素开始标签中使用xmlns属性来声明。...XSLT 也是基于 XML 的,但具备强大的灵活性和扩展性。不仅可以用于文档转换,还常被用于数据清洗、报告生成以及数据的提取和重组等任务。...lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> &lol9; 上述 XML 文件在解析 根节点时不断解析前述定义的实体,最终可以根节点包含...如果显示的是 SAXON xxx from Saxonica 即 Saxon 解释器,那么可以通过 xalan:script 来尝试执行 Java 代码: Saxon 官网文档都是德文的,除了上述这种官网的用法外,还找到另一种执行代码的方法: <xml version="1.0"?

    22210

    xsl模版优先级

    xsl模版优先级 由 Ghostzhang 发表于 2007-05-12 22:29 当一个节点匹配在 XSLT 模板中建立的多个模式(也称为规则)时,处理器就会按照 XSLT 规范中描述的冲突解决指导原则来确定使用哪一个模式...pattern1 | pattern2) Treated as distinct templates, whose priorities are calculated independently 详细列出了如何为现有的不同类型的模式指定默认优先级...这意味着具有多个定位步骤 (Location Step),具有谓词的任何模式都会自动得到默认优先级 0.5。 仍然存在这样的情况:有多个具有相同优先级的模板匹配给定的节点。...由于两个模板的默认优先级都为 0.5,因此 XSLT 处理器要么产生出错信号,要么选择文档中的最后一个模板 — 在本例中为匹配 bar/foo 元素的模板: <xsl:template match='foo...如果您想<em>让</em><em>处理器</em>在出现冲突时始终使用第一个模板,则只需要将它的优先级设为 1,如下面的代码所示: <!

    1.4K30

    【AI 引擎】科大讯飞与约克大学共建实验室 | 利兹成首个能自我维修的城市 | 欧盟下一代超级计算机即将投入使用

    原型机采用了所谓集群增压概念设计,即由许多高性能平行并相互连接的多核处理器构成一个集群,产生类似涡轮增压器的加速效果,运算能力为每秒500万亿次浮点运算。 3....研究人员说城市像一个器官一样能够自我修复,机器人白细胞一样识别城市中的“细菌”“病毒”。 5. 石墨烯纸变形机器人 石墨烯是目前自然界最薄、强度最高的材料。...它可以在不同的温度下做出不同的动作,比如伸展收缩,甚至旋转等等。研究人员之一,东华大学的材料工程师和科学家王洪志说:“我们能够使用光热来控制它以使其走折叠成不同的形状。...他们的研究提供了新的对于我们的脑子如何通过进入我们眼睛的光线来提取我们周边自然环境的信息的看法。 7....其执行董事Leslie Saxon表示,虚拟医生会和患者讨论一系列治疗方案,而且还可以为其电子诊所处方表中添加适合的病患和治疗方案。

    92660

    【翻译】linux中cgroups内存控制子系统memory.oom_control文件

    memory.oom_control 包含一个标志(01)来开启或者关闭cgroup的OOM killer。如果开启(1),任务如果尝试申请内存超过允许,就会被系统OOM killer终止。...如果需要关闭,则可以memory.oom_control文件写入1. echo 1 > /cgroup/memory/lab1/memory.oom_control 如果OOM killer关闭,那么进程尝试申请的内存超过允许...以及notification 处理器如何报告OOM状态....启动的子进程都会自动移入blue组: blue]# echo $$ > tasks 开启测试程序,尝试分配大量内存,超过第二步设置的限制值,很快,blue组耗尽内存,OOM killer终止了test程序,标准输出报告...在一个分开的控制台运行以上通知处理器程序,指定blue层级的控制文件作为参数。 ~]$ .

    1.3K20

    CNVD-2023-34111|Apache Solr 8.3.1 RCE

    请注意,这次渗透测试是在 2020 年进行的,远早于log4j的发现。...参数 instanceDir 和 dataDir 可以设置为任何绝对相对路径,这可以简化攻击。...在测试 CVE-2019-17558 时,文档指出,如果 Velocity XSLT 文件存在于特定目录中,则查询可以被处理。...》可以通过核心创建模块接口返回的不同错误来发现计算机上是否存在文件。 》Solr 的大部分参数都容易受到路径遍历的影响。 0x02 上传文件 在core中,可以上传文件和发送数据以供后端处理。...之后名称变为 UP{4 字母数字哈希}~1.tmp,因为短文件名是如何由 Windows 实现的。 现在,可以在{Base Dir}/server/tmp/ 目录中上传任意文件,并且可以猜测文件名。

    75030

    Python 异步: 在非阻塞子进程中运行命令(19)

    我们可以 asyncio 程序处理子进程的输入输出。 这可以通过指定输入输出流并指定要重定向的常量来实现,例如 asyncio.subprocess.PIPE。...StreamWriter,用于子进程发送数据从子进程发送数据,并且 communicate() 方法将从配置的读取器读取写入字节。...我们可以通过子进程通过 stdin、stdout 和 stderr 属性直接与 StreamReader StreamWriter 交互。...命令的输入和输出将由 shell 处理,例如标准输入、标准错误和标准输出。 我们可以 asyncio 程序处理子进程的输入输出。...StreamWriter,用于子进程发送数据从子进程发送数据,并且 communicate() 方法将从配置的读取器读取写入字节。

    3K40

    2023 Verizon 数据泄露报告:74%安全事件存在人为因素

    事实上,滥用数字证书一直是网络犯罪分子常用攻击手法,其目的是提高恶意软件的合法性,从而绕过企业的安全防护措施。...Log4j是如此重要,以至于和其相关事件在评论部分都有“Log4j“CVE-2021-44228”。但是,只有20.6%的事件有评论。...多因素认证是企业必选项 报告指出,任何企业都需要实施多因素认证(MFA),此举将有效增加攻击者的门槛,因为他们在获取账号密码后,至少还需要具备第二个因素才能访问应用程序数字资源。...这种模式包括通过僵尸网络被入侵的服务器,目标计算机发送垃圾数据,从而制造网络堵塞与服务器瘫痪,造成拒绝服务/无法正常访问。...在这样的情况下,传统防护体系难以抵御,如何防护新型的网络攻击是组织需要解决的难题。

    47850

    周日又加班!Log4j2 刚升级,又爆 “核弹级” 远程数据泄露 !

    该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。...强烈推荐升级2.16.0 修正错误 LOG4J2-3208:默认禁用 JNDI。需要 设置为 以允许 JNDI。LOG4J2-3211:完全删除对消息查找的支持。...Apache Log4j 2.16.0 至少需要 Java 8 才能构建和运行。Log4j 2.12.1 是最后一个支持 Java 7 的版本。Java 7 不是Log4j 团队的长期支持版本。...有关 Apache Log4j 2 的完整信息,包括有关如何提交错误报告、补丁改进建议, 请参阅 Apache Apache Log4j 2 网站:https://logging.apache.org.../log4j/2.x

    25930

    「Hello World」中的「bug」

    如果没有剩余的空间,或者磁盘出现故障,那么创建实际的文件系统是很不方便的,但是一个程序将其输出写入「/dev/full」,然后看看会发生什么,这是非常容易的。...\n", 13) = -1 ENOSPC (No space left on device)+++ exited with 0 +++ 操作系统报告了「No space」错误,但没关系...如果一个程序没有检测到这种错误并通过其返回代码报告错误,那么它的父进程将不知道子进程失败了,并且将继续运行,就像没有任何错误一样,即使它期望产生的输出已经悄悄地丢失了数据。...0 它确实 stderr 打印了一条消息,尽管这是一条令人困惑的消息。但是,它也返回 0,这意味着它告诉运行它的人它已经成功退出。...幸运的是,Python 3 正确地报告错误,并打印了一个更好的错误消息: $ python3 hello.py > /dev/fullException ignored in: <_io.TextIOWrapper

    41720

    高性能无锁队列 Disruptor 初体验

    针对伪共享问题的优化 Disruptor 消除这个问题,至少对于缓存行大小是64字节更少的处理器架构来说是这样的(有可能处理器的缓存行是128字节,那么使用64字节填充还是会存在伪共享问题),通过增加补全来确保...通过上面的介绍,我们大概可以了解到 Disruptor 是一个高性能的无锁队列,那么该如何使用呢,下面楼主通过 Disruptor 实现一个简单的生产者消费者模型,介绍 Disruptor 的使用 首先...) { this.value = value; } public long getValue() { return value; } } 为了...另外在Log4j 2中的异步模式采用了Disruptor来处理。...在这里楼主遇到一个小问题,就是在使用Log4j 2通过 TCP 模式往 logstash 发日志数据的时候,由于网络问题导致链接中断,从而导致 Log4j 2 不停的往 ringbuffer 中写数据,

    1.5K30

    学习 XSLT:XML文档转换的关键

    每个标签的含义以及如何显示已经被充分理解。CSS 用于 HTML 元素添加样式。XSL = XML 的样式表XML 不使用预定义标签,因此每个标签的含义并不是很清楚。...一个 元素可能表示 HTML 表格、一件家具其他东西 - 浏览器不知道如何显示它!因此,XSL 描述了 XML 元素应如何显示。...通常,XSLT 通过将每个 XML 元素转换为(X)HTML 元素来实现此目的。使用 XSLT,您可以输出文件添加/删除元素和属性。...它是如何工作的在转换过程中,XSLT 使用 XPath 定义应与一个多个预定义模板匹配的源文档的部分。当找到匹配时,XSLT 将源文档的匹配部分转换为结果文档。...通过 XML 文件添加 XSL 样式表并浏览器执行转换来实现这一点。即使这种方法运行良好,但并不总是希望在 XML 文件中包含样式表引用(例如,在非 XSLT 感知的浏览器中无法工作)。

    16010

    「Go框架」gin框架是如何处理panic的?

    那么,如何能够做到发生panic时技能捕获该panic又能让服务继续健康运行呢? 这就是golang中提供的recover函数了。recover函数能够捕获Panic错误并恢复程序的正常运行。...即指错误的输出到什么地方。...如下: 主要分三部分: 将日志输出到out中,这里是上述提到的DefaultErrorWriter,即os.Stderr。 defer延迟执行部分。 c.Next()正常请求处理器部分。...作为中间件运行,说明每次请求的处理器都被中间件包装了,也就相当于每个请求处理器都有这个defer函数。...在defer函数中,如果捕获了panic,则将panic的详细详细记录下来,可以发送到指定的输出中,即函数中指定的out参数(默认是os.Stderr),也可以指定其他的文件Sentry等。

    64740

    大数据必学Java基础(一百零三): log4j日志框架

    二、如何记录日志方式1:System.out.println(.....)...方式3:使用现成的日志框架,比如log4j优点:长久保存 有等级格式可以很好的定制 代码编写简单三、 log4j日志的级别FATAL:指出现非常严重的错误事件,这些错误可能导致应用程序异常中止。...ERROR:指虽有错误,但仍允许应用程序继续运行。WARN:指运行环境潜藏着危害。INFO:指报告信息,这些信息在粗粒度级别上突出显示应用程序的进程。...%d:输出日志时间点的日期时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。%r:输出自应用程序启动到输出该log信息耗费的毫秒数。...logger.info("连接池空,创建新连接:"+connection.hashCode()); } return connection; } // 共有的连接池归还连接对象的方法

    43991

    django 1.8 官方文档翻译:6-6-5 错误报告

    下面的例子展示了如何排除一些浏览器爬虫经常请求的常用URL: import re IGNORABLE_404_URLS = ( re.compile(r'^/apple-touch-icon....另见 404错误使用日志框架来记录。通常,日志记录会被忽略,但是你可以通过编写合适的处理器和配置日志,将它们用于错误报告。...自定义错误报告 所有sensitive_variables()  和 sensitive_post_parameters()分别用敏感变量的名字被装饰的函数添加注解,以及用POST敏感参数的名字HttpRequest...如果你希望为你的整个站点覆写自定义这一默认的属性,你需要定义你自己的过滤器类,并且通过DEFAULT_EXCEPTION_REPORTER_FILTER 设置来Django使用它。...如果你编写了自定义的错误处理器,模拟Django内建的错误处理器,只在DEBUG 为 False时报告记录错误是个好主意。

    84320
    领券