Class: Lutaml::Xsd::Validation::BaseTypes::QNameValidator

Inherits:
BaseTypeValidator show all
Defined in:
lib/lutaml/xsd/validation/base_types/qname_validator.rb

Overview

Validates XSD QName type

The QName (Qualified Name) type represents an XML qualified name, which consists of an optional namespace prefix and a local part separated by a colon.

Examples:

Validating QName values

validator = QNameValidator.new
validator.valid?("prefix:localName")  # => true
validator.valid?("localName")         # => true
validator.valid?("ns:element")        # => true
validator.valid?(":noPrefix")         # => false
validator.valid?("prefix:")           # => false
validator.valid?("has space")         # => false

Constant Summary collapse

NCNAME_PATTERN =

NCName pattern (Non-Colonized Name)

/^[a-zA-Z_][\w.-]*$/
QNAME_PATTERN =

QName pattern (prefix:localName or just localName)

/^([a-zA-Z_][\w.-]*:)?[a-zA-Z_][\w.-]*$/

Instance Method Summary collapse

Methods inherited from BaseTypeValidator

for, registered?, #type_name

Instance Method Details

#error_message(value) ⇒ String

Generate error message for invalid QName

Parameters:

  • value (Object)

    The invalid value

Returns:

  • (String)

    Error message



59
60
61
62
# File 'lib/lutaml/xsd/validation/base_types/qname_validator.rb', line 59

def error_message(value)
  "Value '#{value}' is not a valid QName. " \
    "Expected format: [prefix:]localName"
end

#valid?(value) ⇒ Boolean

Validate value is a valid QName

Parameters:

  • value (Object)

    The value to validate

Returns:

  • (Boolean)

    true if value is a valid QName



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/lutaml/xsd/validation/base_types/qname_validator.rb', line 35

def valid?(value)
  return false if value.nil?

  str = to_string(value).strip
  return false if str.empty?

  # Must match QName pattern
  return false unless str.match?(QNAME_PATTERN)

  # If it has a colon, validate both parts
  if str.include?(":")
    prefix, local = str.split(":", 2)
    return false if prefix.empty? || local.empty?
    return false unless prefix.match?(NCNAME_PATTERN)
    return false unless local.match?(NCNAME_PATTERN)
  end

  true
end