Class: Lutaml::Xml::Decisions::Rules::UsedPrefixRule

Inherits:
DecisionRule
  • Object
show all
Defined in:
lib/lutaml/xml/decisions/rules/used_prefix_rule.rb

Overview

Priority 0.15: Preserve used prefix from deserialization

When an element was deserialized from XML with a specific prefix, preserve that prefix during serialization for round-trip fidelity.

This handles the dual-namespace case where multiple elements with the same local name but different namespaces (e.g., m:rPr and w:rPr) need to preserve their respective prefixes during round-trip.

CRITICAL: Only applies when parent has a namespace. This prevents the rule from incorrectly applying when the parent has no namespace (where elements should use default format).

Instance Method Summary collapse

Methods inherited from DecisionRule

#<=>, #name

Instance Method Details

#applies?(context) ⇒ Boolean

Applies when:

  • Element has a used_prefix from deserialization

  • Element is not the root (root uses model’s prefix_default)

  • The used_prefix matches the namespace’s prefix_default

  • Parent’s XmlElement has a non-nil namespace_prefix (i.e., parent used prefix format, not default namespace format)

  • Namespace has element_form_default :qualified set (namespaces without explicit :qualified should use default format)

This handles the dual-namespace case where multiple elements with the same local name but different namespaces (e.g., m:rPr and w:rPr) need to preserve their respective prefixes during round-trip.

Returns:

  • (Boolean)


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/lutaml/xml/decisions/rules/used_prefix_rule.rb', line 37

def applies?(context)
  return false if context.root?
  return false unless context.has_namespace?
  return false if context.element_used_prefix.nil? || context.element_used_prefix.empty?

  ns_class = context.namespace_class

  # Skip if namespace does NOT have element_form_default :qualified
  # Namespaces without explicit :qualified should use default format
  # (e.g., dcterms namespace uses default format, not prefix)
  return false unless ns_class.respond_to?(:element_form_default_set?) &&
    ns_class.element_form_default_set? &&
    ns_class.element_form_default == :qualified

  # The used_prefix should match the namespace's prefix_default
  # AND parent must have actually used prefix format (not default namespace)
  context.namespace_class.prefix_default == context.element_used_prefix &&
    !context.parent_namespace_prefix.nil? &&
    !context.parent_namespace_prefix.empty?
end

#decide(context) ⇒ Object

Decision: Use the used prefix from deserialization



59
60
61
62
63
64
65
# File 'lib/lutaml/xml/decisions/rules/used_prefix_rule.rb', line 59

def decide(context)
  Decision.prefix(
    prefix: context.element_used_prefix,
    namespace_class: context.namespace_class,
    reason: "Priority 0.15: Preserve used prefix from deserialization for round-trip",
  )
end

#priorityObject

Priority 0.15 - Between InheritFromParentRule (0) and ElementFormDefaultUnqualifiedRule (0.5)



21
22
23
# File 'lib/lutaml/xml/decisions/rules/used_prefix_rule.rb', line 21

def priority
  0.15
end