如何解决如何使用XML架构或另一种XML语言使一致的XML解析器填写缺少的属性和值
我正在寻找一种简单,可重用的方法,该方法可以使XML解析器将属性及其关联的值添加到缺少属性和/或具有不同值的特定名称的任何元素中,或者引发解析错误。理想情况下,主要浏览器的最新版本都支持该解决方案,但是浏览器对XML的支持通常并不是那么好,而且浏览器之间的差异也很大,因此,如果没有浏览器支持也可以。
实际上,我可以接受任何标准化的XML扩展名/命名空间/等来使这项工作生效。
有关我要执行的操作的更好示例,我们以XHTML script
标记为例。我有一个标签名称为*script*
的元素,它来自XHTML命名空间*xhtml:*
,我正在寻找元素*xhtml:script*
缺少任何属性{{1 }},*async*
或*defer*
,或者具有我想要的值以外的其他值,或者标签之间包含任何文本内容(应该是自动关闭的标签)。>
我正在尝试自动制作任何如下所示的脚本标签:
*type*
要转换为:
<script src="main.js" />
或者,至少要使XML解析器在那时出错并暂停解析。
理想情况下,甚至不允许使用XML文件的作者,因为它们应该 总是会自动用正确的值填充。
我曾经以为XSL(T)可以解决这个问题,但这将需要生成一个全新的输出文件。如果我误解了XSL,请随时纠正我。
虽然,我确实希望它像使用XSL一样简单。要使用XSL,必须对源文档进行的所有操作是添加 <script async="async" defer="defer" type="module" src="main.js" />
。
另外,我不确定浏览器对XSL 2.0的支持程度如何,
因此,我开始研究其他相关的XML技术,遇到了XML-Schema(XSD)。
在网络上搜索有关它们的任何信息之后,我发现w3schools在XML模式 xml-stylesheet
元素的attribute
属性中说了以下内容:>
当未指定其他值时,固定值也会自动分配给属性。但是与默认值不同;如果您指定的不是固定值,则该文档被视为无效。
所以,看起来这正是我想要的,经过四处寻找之后,我开始关注:
fixed
但这似乎对文档的解析没有任何影响。
解决方法
Saxon的模式处理器具有扩展名saxon:preprocess
https://saxonica.com/documentation/index.html#!schema-processing/extensions11/preprocess
在我看来,这可以用来实现您的要求。如果您(a)定义属性的默认值,并且(b)定义saxon:preprocess构面,则在预处理表达式中,您可以接受任何输入值并将其转换为有效值。
要实际输出包含结果值的文档,您需要将经过验证/预处理的XML作为输入提供给可识别模式的XSLT样式表,该样式表将复制输入的类型化的值以成为输出的字符串值: <xsl:attribute name="{name()}" select="data()}"/>
。
这在浏览器中不起作用(Saxon-JS不支持架构处理)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。