You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完成配置,步骤如下:

  1. 获取Schema-Aware转换工厂:
    实例化Saxon EE的TransformerFactoryImpl(需确保引入EE版依赖),它实现了SchemaAwareTransformerFactory接口:
    import net.sf.saxon.TransformerFactoryImpl;
    import net.sf.saxon.lib.SchemaAwareTransformerFactory;
    
    SchemaAwareTransformerFactory factory = new TransformerFactoryImpl();
    
  2. 加载并注册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")));
    
  3. 启用Schema验证:
    通过工厂属性配置验证模式:
    import net.sf.saxon.lib.FeatureKeys;
    import net.sf.saxon.lib.Validation;
    
    factory.setAttribute(FeatureKeys.SCHEMA_VALIDATION, Validation.SCHEMA_AWARE);
    
  4. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:55:12