Saxon-J EE 12.5:属性默认值展开与schema-aware转换咨询
Saxon-J EE 12.5:Schema-Aware转换与属性默认值展开问题解答
理解确认
你对“输入中未指定属性值时,该属性会被视为采用默认值”的理解是正确的,但这仅在开启了schema/DTD验证且该属性在schema/DTD中定义了默认值的前提下生效。
问题解答
1. 如何启用Schema-Aware转换并指定Schema?(Java API与XSL文件两种方式)
Saxon-J EE 12.5支持两种方式配置Schema-Aware转换,并非必须在XSL文件中指定:
方式一:通过XSL文件指定
在XSLT样式表中直接引入Schema,同时确保转换引擎以Schema-Aware模式运行:
- 使用
<xsl:import-schema>或<xsl:include-schema>标签引入Schema,示例:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:import-schema schema-location="path/to/your/schema.xsd"/> <!-- 其他样式表内容 --> </xsl:stylesheet>
- 也可直接在
<xsl:stylesheet>标签的schema-location属性中指定Schema路径。
方式二:通过Java API实现
使用Saxon EE的Schema-Aware相关API完成配置,步骤如下:
- 获取Schema-Aware转换工厂:
实例化Saxon EE的TransformerFactoryImpl(需确保引入EE版依赖),它实现了SchemaAwareTransformerFactory接口:import net.sf.saxon.TransformerFactoryImpl; import net.sf.saxon.lib.SchemaAwareTransformerFactory; SchemaAwareTransformerFactory factory = new TransformerFactoryImpl(); - 加载并注册Schema:
通过SchemaManager加载XSD文件并注册到处理器配置中:import net.sf.saxon.s9api.SchemaManager; import net.sf.saxon.s9api.Processor; import javax.xml.transform.stream.StreamSource; import java.io.File; Processor processor = new Processor(true); // true参数启用Schema-Aware模式 SchemaManager schemaManager = processor.getSchemaManager(); schemaManager.load(new StreamSource(new File("path/to/your/schema.xsd"))); - 启用Schema验证:
通过工厂属性配置验证模式:import net.sf.saxon.lib.FeatureKeys; import net.sf.saxon.lib.Validation; factory.setAttribute(FeatureKeys.SCHEMA_VALIDATION, Validation.SCHEMA_AWARE); - 创建Transformer执行转换:
后续流程与普通XSLT转换一致,此时转换会以Schema-Aware模式运行,并应用你注册的Schema。
2. 展开属性默认值的额外配置?
根据Saxon的EXPAND_ATTRIBUTE_DEFAULTS特性规则:
- 默认情况下,只要开启了Schema/DTD验证,Saxon会自动展开定义的属性默认值与固定值(符合规范要求)。
- 如果该特性曾被手动设置为
false,需通过配置将其恢复为true,示例代码:import net.sf.saxon.Configuration; Configuration config = processor.getConfiguration(); config.setFeature("http://saxon.sf.net/feature/expandAttributeDefaults", true); - 注意:对于DTD定义的默认值,需要XML解析器支持区分“原始文档中指定的属性”和“默认展开的属性”,并非所有解析器都具备此能力;但Schema定义的默认值由Saxon自身处理,无需依赖解析器额外支持。
内容的提问来源于stack exchange,提问作者Hervé Girod
相关产品推荐
相关产品推荐

