From 7dad9e784a1c29652f8193499d071caf44da4969 Mon Sep 17 00:00:00 2001 From: mtlcl410 Date: Thu, 5 Nov 2026 17:21:39 +0800 Subject: [PATCH] M11: PDF/A verify takes an rdf:value attribute in place of the element, not beside it (6.6.2.3.1) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Pq7HyDBXygTf7jcqdsjcfn --- crates/preflight/src/tests.rs | 5 +++++ crates/preflight/src/xmp_types.rs | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/preflight/src/tests.rs b/crates/preflight/src/tests.rs index 23677867a2..adc4ac57b4 100644 --- a/crates/preflight/src/tests.rs +++ b/crates/preflight/src/tests.rs @@ -718,6 +718,11 @@ fn xmp_value_forms_are_those_xmp_allows() { mistyped(r#">5five"#), ["crs:Contrast"] ); + assert_eq!( + mistyped(r#">5"#), + ["crs:Contrast"] + ); + assert!(mistyped(r#">5"#).is_empty()); // Only parseType="Resource" has a place in XMP; an rdf:resource element holds no element. assert_eq!(mistyped(r#">5"#), ["crs:Contrast"]); assert_eq!(mistyped(r#">"#), ["xmpMM:DerivedFrom"]); diff --git a/crates/preflight/src/xmp_types.rs b/crates/preflight/src/xmp_types.rs index 84f3ce6d9b..333b39ab12 100644 --- a/crates/preflight/src/xmp_types.rs +++ b/crates/preflight/src/xmp_types.rs @@ -549,10 +549,10 @@ fn fits(ty: Ty, e: &Node<'_, '_>, depth: usize) -> bool { // predefined properties keep their types too. let node = if resource { Some(*e) } else { description }; if let Some(n) = node { - // A qualified value has one `rdf:value`. + // A qualified value has one `rdf:value`: an element, or an attribute in its place. match n.children().filter(|c| is(c, RDF, "value")).collect::>().as_slice() { [] => {} - [v] => return blank(e) && blank(&n) && fits(ty, v, deeper) && predefined_ok(&n, deeper), + [v] => return n.attribute((RDF, "value")).is_none() && blank(e) && blank(&n) && fits(ty, v, deeper) && predefined_ok(&n, deeper), _ => return false, } }