如何使用 xslt 读取 xml 的 doctype 声明?

How to read doctype declaration of an xml using xslt?

提问人:GreatPretender 提问时间:9/19/2023 最后编辑:Mads HansenGreatPretender 更新时间:9/19/2023 访问量:44

问:

有没有办法使用 xslt 读取 xml 的 doctype 声明?

XML 文档类型声明示例:

<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD with OASIS Tables with MathML3 v1.1 20151215//EN" "JATS-archive-oasis-article1-mathml3.dtd">

我需要检查doctype声明是否包含上面提到的特定dtd,如果条件为真,那么我需要在我的xml输出中生成一个元素。

我试过了.在本地,它通过提供 xml 文件的 uri 来工作,但在管道中它不是。unparsed-text-lines()unparsed-text()

有没有办法阅读这些内容?

我找到了 saxon:schema 函数,但不确定如何使用它,或者它是否仅适用于 xml 和 xsd 组合,而不是用于 xml 和 dtd 的事情。

https://www.saxonica.com/html/documentation11/functions/saxon/schema.html

XML XSLT 撒克逊 DTD

评论

0赞 GreatPretender 9/19/2023
下面是示例文档类型:<!DOCTYPE 文章 PUBLIC “-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD with OASIS Tables with MathML3 v1.1 20151215//EN” “JATS-archive-oasis-article1-mathml3.dtd”>
1赞 Martin Honnen 9/19/2023
我不认为 Saxon 本身提供了这一点,曾经有一种名为 LexEv 的工具可以,我认为可以将 DTD(不是 XPath/XSLT XDM 数据模型的一部分)之类的东西预处理到 XDM 的节点中(我认为在 DOCTYPE 的情况下可以处理指令节点)。根据 Java 版本的不同,我认为 SAX API 现在也有一个 doctype 事件,因此设置过滤器/预处理步骤来提供数据可能很容易。
0赞 Michael Kay 9/20/2023
我相信 LexEv 仍然作为 Andrew Welch 编写的 Kernow 产品 (KernowForSaxon) 的一部分提供,并且可以从 SourceForge 获得。它已经多年没有更新了,但由于它唯一的依赖是稳定的 SAX 和 JAXP 接口,因此没有理由它不应该仍然可用。
0赞 Michael Kay 9/20/2023
saxon:schema()无济于事。这仅适用于 XSD 架构信息,不适用于 DTD。
0赞 Dimitre Novatchev 9/20/2023
当然不是。这是XSLT(以及它使用的XDM)的美妙之处之一。还有很多其他细节,比如 XML 声明,或者词法细节,比如使用撇号与引号,或者使用短闭合标记或紧跟结束标记的开始标记来表示空元素。

答:

1赞 Michael Kay 9/19/2023 #1

DOCTYPE声明不是XDM数据模型的一部分,这意味着它不是可以使用标准XSLT/XPath结构访问的文档的一部分。

正如 Martin 所指出的,它可供 SAX 应用程序使用(具体而言,通过将 startDTD 和 endDTD 通知给 LexicalHandler)。您可以通过编写一个 SAX 过滤器来利用这一点,该过滤器将 DOCTYPE 声明转换为合适的处理指令。URIResolver 可以返回包含此筛选器的 SAXSource;然后,XSLT 代码可以作为文档(根)节点的处理指令子节点访问 DOCTYPE 声明。