xml-canonicalization 0.1.2

XML Canonicalisation Library in pure Rust
Documentation
StartTag = {
  SOI ~
  QName ~
  Attribute* ~
  EOI
}

QName = ${
  PrefixedName | UnprefixedName
}

PrefixedName = ${
  Prefix ~ ":" ~ LocalPart
}

UnprefixedName = ${
  LocalPart
}

Prefix = @{
  Name
}

LocalPart = @{
  Name
}

Name = @{
  NameStartCharMod ~ (NameChar)*
}

NameStartCharMod = @{
  // ":" |
  'A'..'Z' |
  "\x5f" |
  'a'..'z' |
  '\u{00C0}'..'\u{00D6}' |
  '\u{00D8}'..'\u{00F6}' |
  '\u{00F8}'..'\u{02FF}' |
  '\u{0370}'..'\u{037D}' |
  '\u{037F}'..'\u{1FFF}' |
  '\u{200C}'..'\u{200D}' |
  '\u{2070}'..'\u{218F}' |
  '\u{2C00}'..'\u{2FEF}' |
  '\u{3001}'..'\u{D7FF}' |
  '\u{F900}'..'\u{FDCF}' |
  '\u{FDF0}'..'\u{FFFD}' |
  '\u{10000}'..'\u{EFFFF}'
}

NameChar = @{
  NameStartCharMod |
  "-" |
  "." |
  '0'..'9' |
  "\u{00B7}" |
  '\u{0300}'..'\u{036F}' |
  '\u{203F}'..'\u{2040}'
}

Attribute = {
  QName ~
  "=" ~
  AttValue
}

AttValue = ${
  ("\"" ~ AttValueInnerDoubleQuote ~ "\"") |
  ("'" ~ AttValueInnerSingleQuote ~ "'") |
  AttValueInnerNoSpaces
}

AttValueInnerDoubleQuote = @{
  (AttValueCharDoubleQuote | Reference)*
}

AttValueInnerSingleQuote = @{
  (AttValueCharSingleQuote | Reference)*
}

AttValueInnerNoSpaces = @{
  (!(" ") ~ (AttValueChar | Reference))*
}

AttValueChar = @{
  !(
    "&" | "\"" | "'" // | "<"
  ) ~ ANY
}

AttValueCharSingleQuote = @{
  !(
    "&" | "\'" // | "<"
  ) ~ ANY
}

AttValueCharDoubleQuote = @{
  !(
    "&" | "\"" // | "<"
  ) ~ ANY
}

Reference = _{
  EntityRef | CharRef
}

EntityRef = @{
  "&" ~ Name ~ ";"
}

CharRef = @{
  ("&#" ~ ('0'..'9')+ ~ ";") |
  ("&#x" ~ ('0'..'9' | 'a'..'f' | 'A'..'F')+ ~ ";")
}

WHITESPACE = _{ "\x20" | "\x09" | "\x0D" | "\x0A" }