【发布时间】:2020-04-08 01:05:34
【问题描述】:
我想弄清楚我是否在 xml 文档中正确地声明了我的 DTD 元素。据我所知,xsltproc 或 xmllint 都没有检测到以下文档中的有效性错误:
<!DOCTYPE basic-dtd [
<!ENTITY title "The Book of Love">
<!ENTITY author "Jeffrey Halcomb">
<!ELEMENT basic-dtd (title,author,subject,checked-out)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT checked-out EMPTY>
]>
<basic-dtd>
<author>&author;</author>
<title>&title;</title>
<subject>A treatise on love as a driving elemental force in nature</subject>
<checked-out>Yes</checked-out>
</basic-dtd>
在我的 doctype 指令中,我(相信)我已经指定:
- basic-dtd 元素中元素的正确顺序是标题、作者、主题和已签出。
- “已签出”元素不应包含任何数据(PCDATA、CDATA 或子元素)
然而,当我对这个 xml (xsltproc basic-dtd.xsl basic-dtd.xml) 运行以下样式表时,它没有报告任何错误/警告。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/basic-dtd">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
同样,当我运行 xmllint (xmllint --noent basic-dtd.xml) 时,它不会报告任何错误。
xsltproc 和 xmllint(带 --noent)确实会处理实体,如果使用未知实体,则会出错。
我是在使用苹果处理器来转换/打印 orange-xml(该工作的工具错误),还是这是一个已知功能?
谢谢,
汤姆
【问题讨论】:
-
我不记得 xsltproc 进行了验证。您是否尝试过使用 xmllint 的
--valid命令行参数? -
是的!谢谢!那成功了。我认为有趣的是,可以在样式表、模式等中使用 DTD... 只是在有限的范围内:- 向元素添加默认/固定值,以及 - 使用实体在输出中创建 xsl:params/text。跨度>
-
总是有模式感知 XSLT 处理器的选项,例如 Saxon PE/HE。
-
添加了我的 cmets 作为答案。