我正在使用 Saxon-J EE 12.5,我不明白如何使用默认值扩展属性,并且还使用模式感知转换(我知道如果我想扩展默认值,我需要使用模式感知转换)属性值,符合逻辑)。
基本上我理解,如果输入中不存在该值,则此扩展将认为该属性值具有默认值。我说得对吗?
在 Saxon 配置属性中,EXPAND_ATTRIBUTE_DEFAULTS 属性解释为: http://saxon.sf.net/feature/expandAttributeDefaults
EXPAND_ATTRIBUTE_DEFAULTS 确定是否扩展模式或 DTD 中定义的固定值和默认值(如果请求验证,则在输入和输出文档上扩展)。 默认情况下(为了与规范保持一致)针对 DTD 或模式的验证将导致模式或 DTD 中定义的默认值被插入到文档中。将此功能设置为 false 可抑制此行为。对于 DTD 定义的默认值,仅当 XML 解析器报告每个属性是在源中指定还是通过扩展默认值生成时才有效。并非所有 XML 解析器都会报告此信息。
我有这些问题:
关键不是转换是模式感知的,而是源文档根据模式进行验证。
如果您使用 s9api 接口,首先需要从
new Processor(true)
开始强制加载 Saxon-EE 配置。
您可以通过 s9api API 或转换来控制源文档的验证。例如,您可以使用
Processor
将模式加载到 SchemaManager
,从中获取 SchemaValidator
,并将 SchemaValidator
提供给用于构建转换源文档的 DocumentBuilder
。
另一种方法是,将作为转换输入提供的
Source
对象作为您调用 AugmentedSource
的 setSchemaValidationMode(...)
的实例。
您还可以通过编写使用 XSLT 逻辑来调用验证,例如
<xsl:copy-of select="..." validation="strict"/>
。在这种情况下,可以使用上面的 SchemaManager
API 或在样式表中使用 <xsl:import-schema>
来提供用于验证的模式。这种方法可能效率较低,因为最好在解析文档并将其构建到树中时执行模式验证,而不是随后复制树。