Skip to content

Commit 5d309b7

Browse files
engine (fix): omit default namespace in submission XML serialization
Per discussion in review, this is consistent with Collect and Enketo. Including the namespace is probably more “correct”, but consistency is more important if there’s any chance anything downstream depends on the default namespace being `null`.
1 parent 0287a16 commit 5d309b7

File tree

2 files changed

+35
-39
lines changed

2 files changed

+35
-39
lines changed

packages/scenario/test/submission.test.ts

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import {
2-
OPENROSA_XFORMS_NAMESPACE_URI,
3-
XFORMS_NAMESPACE_URI,
4-
} from '@getodk/common/constants/xmlns.ts';
1+
import { OPENROSA_XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
52
import {
63
bind,
74
body,
@@ -145,7 +142,7 @@ describe('Form submission', () => {
145142

146143
expect(scenario).toHaveSerializedSubmissionXML(
147144
// prettier-ignore
148-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="xml-serialization-basic-default-values"`,
145+
t(`data id="xml-serialization-basic-default-values"`,
149146
t('grp',
150147
t('inp', defaults.inp ?? ''),
151148
t('sel1', defaults.sel1 ?? ''),
@@ -190,7 +187,7 @@ describe('Form submission', () => {
190187

191188
expect(scenario).toHaveSerializedSubmissionXML(
192189
// prettier-ignore
193-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="${formId}" version="${version}"`,
190+
t(`data id="${formId}" version="${version}"`,
194191
t('inp', 'val'),
195192
t('meta',
196193
t('instanceID', DEFAULT_INSTANCE_ID))).asXml()
@@ -226,7 +223,7 @@ describe('Form submission', () => {
226223

227224
expect(scenario).toHaveSerializedSubmissionXML(
228225
// prettier-ignore
229-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" xmlns:orx="${OPENROSA_XFORMS_NAMESPACE_URI}" id="${formId}" orx:version="${version}"`,
226+
t(`data xmlns:orx="${OPENROSA_XFORMS_NAMESPACE_URI}" id="${formId}" orx:version="${version}"`,
230227
t('inp', 'val'),
231228
t('meta',
232229
t('instanceID', DEFAULT_INSTANCE_ID))).asXml()
@@ -262,7 +259,7 @@ describe('Form submission', () => {
262259

263260
expect(scenario).toHaveSerializedSubmissionXML(
264261
// prettier-ignore
265-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" xmlns:orx="${OPENROSA_XFORMS_NAMESPACE_URI}" id="${formId}" orx:version="${version}"`,
262+
t(`data xmlns:orx="${OPENROSA_XFORMS_NAMESPACE_URI}" id="${formId}" orx:version="${version}"`,
266263
t('inp', 'val'),
267264
t('meta',
268265
t('instanceID', DEFAULT_INSTANCE_ID))).asXml()
@@ -316,7 +313,7 @@ describe('Form submission', () => {
316313

317314
expect(scenario).toHaveSerializedSubmissionXML(
318315
// prettier-ignore
319-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="unicode-normalization"`,
316+
t(`data id="unicode-normalization"`,
320317
t('rep',
321318
t('inp', composed)),
322319
t('meta',
@@ -331,7 +328,7 @@ describe('Form submission', () => {
331328

332329
expect(scenario).toHaveSerializedSubmissionXML(
333330
// prettier-ignore
334-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="unicode-normalization"`,
331+
t(`data id="unicode-normalization"`,
335332
t('rep',
336333
t('inp', composed)),
337334
t('meta',
@@ -369,7 +366,7 @@ describe('Form submission', () => {
369366
it('does not serialize an element for a repeat range', () => {
370367
expect(scenario).toHaveSerializedSubmissionXML(
371368
// prettier-ignore
372-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="xml-serialization-repeats"`,
369+
t(`data id="xml-serialization-repeats"`,
373370
t('meta',
374371
t('instanceID', DEFAULT_INSTANCE_ID))).asXml()
375372
);
@@ -383,7 +380,7 @@ describe('Form submission', () => {
383380

384381
expect(scenario).toHaveSerializedSubmissionXML(
385382
// prettier-ignore
386-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="xml-serialization-repeats"`,
383+
t(`data id="xml-serialization-repeats"`,
387384
t('rep',
388385
t('inp', 'a')),
389386
t('rep',
@@ -396,7 +393,7 @@ describe('Form submission', () => {
396393

397394
expect(scenario).toHaveSerializedSubmissionXML(
398395
// prettier-ignore
399-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="xml-serialization-repeats"`,
396+
t(`data id="xml-serialization-repeats"`,
400397
t('rep',
401398
t('inp', 'b')),
402399
t('meta',
@@ -447,7 +444,7 @@ describe('Form submission', () => {
447444

448445
expect(scenario).toHaveSerializedSubmissionXML(
449446
// prettier-ignore
450-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="xml-serialization-relevance"`,
447+
t(`data id="xml-serialization-relevance"`,
451448
t('grp-rel', '1'),
452449
t('inp-rel', '0'),
453450
t('grp'),
@@ -461,7 +458,7 @@ describe('Form submission', () => {
461458

462459
expect(scenario).toHaveSerializedSubmissionXML(
463460
// prettier-ignore
464-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="xml-serialization-relevance"`,
461+
t(`data id="xml-serialization-relevance"`,
465462
t('grp-rel', '0'),
466463
t('inp-rel', '1'),
467464
t('meta',
@@ -514,7 +511,7 @@ describe('Form submission', () => {
514511
// Default serialization before any state change
515512
expect(serialized).toBe(
516513
// prettier-ignore
517-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
514+
t(`data id="reactive-xml-serialization"`,
518515
t('rep-inp-rel'),
519516
t('rep',
520517
t('inp')),
@@ -529,7 +526,7 @@ describe('Form submission', () => {
529526
// After first value change
530527
expect(serialized).toBe(
531528
// prettier-ignore
532-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
529+
t(`data id="reactive-xml-serialization"`,
533530
t('rep-inp-rel'),
534531
t('rep',
535532
t('inp', `${i}`)),
@@ -549,7 +546,7 @@ describe('Form submission', () => {
549546
// Default serialization before any state change
550547
expect(serialized).toBe(
551548
// prettier-ignore
552-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
549+
t(`data id="reactive-xml-serialization"`,
553550
t('rep-inp-rel'),
554551
t('rep',
555552
t('inp')),
@@ -562,7 +559,7 @@ describe('Form submission', () => {
562559
// First repeat instance added
563560
expect(serialized).toBe(
564561
// prettier-ignore
565-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
562+
t(`data id="reactive-xml-serialization"`,
566563
t('rep-inp-rel'),
567564
t('rep',
568565
t('inp')),
@@ -577,7 +574,7 @@ describe('Form submission', () => {
577574
// Second repeat instance added
578575
expect(serialized).toBe(
579576
// prettier-ignore
580-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
577+
t(`data id="reactive-xml-serialization"`,
581578
t('rep-inp-rel'),
582579
t('rep',
583580
t('inp')),
@@ -596,7 +593,7 @@ describe('Form submission', () => {
596593
// Each of the above values set
597594
expect(serialized).toBe(
598595
// prettier-ignore
599-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
596+
t(`data id="reactive-xml-serialization"`,
600597
t('rep-inp-rel'),
601598
t('rep',
602599
t('inp', 'rep 1 inp')),
@@ -613,7 +610,7 @@ describe('Form submission', () => {
613610
// Last repeat instance removed
614611
expect(serialized).toBe(
615612
// prettier-ignore
616-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
613+
t(`data id="reactive-xml-serialization"`,
617614
t('rep-inp-rel'),
618615
t('rep',
619616
t('inp', 'rep 1 inp')),
@@ -628,7 +625,7 @@ describe('Form submission', () => {
628625
// First repeat instance removed
629626
expect(serialized).toBe(
630627
// prettier-ignore
631-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
628+
t(`data id="reactive-xml-serialization"`,
632629
t('rep-inp-rel'),
633630
t('rep',
634631
t('inp', 'rep 2 inp')),
@@ -641,7 +638,7 @@ describe('Form submission', () => {
641638
// All repeat instances removed
642639
expect(serialized).toBe(
643640
// prettier-ignore
644-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
641+
t(`data id="reactive-xml-serialization"`,
645642
t('rep-inp-rel'),
646643
t('meta',
647644
t('instanceID', DEFAULT_INSTANCE_ID))).asXml()
@@ -664,7 +661,7 @@ describe('Form submission', () => {
664661
// Current serialization before any relevance change
665662
expect(serialized).toBe(
666663
// prettier-ignore
667-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
664+
t(`data id="reactive-xml-serialization"`,
668665
t('rep-inp-rel'),
669666
t('rep',
670667
t('inp', 'rep 1 inp')),
@@ -681,7 +678,7 @@ describe('Form submission', () => {
681678
// Non-relevant /data/rep[position() != '1']/inp omitted
682679
expect(serialized).toBe(
683680
// prettier-ignore
684-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
681+
t(`data id="reactive-xml-serialization"`,
685682
t('rep-inp-rel', '1'),
686683
t('rep',
687684
t('inp', 'rep 1 inp')),
@@ -696,7 +693,7 @@ describe('Form submission', () => {
696693
// Non-relevant /data/rep[position() != '3']/inp omitted
697694
expect(serialized).toBe(
698695
// prettier-ignore
699-
t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="reactive-xml-serialization"`,
696+
t(`data id="reactive-xml-serialization"`,
700697
t('rep-inp-rel', '3'),
701698
t('rep'),
702699
t('rep'),
@@ -846,7 +843,7 @@ describe('Form submission', () => {
846843
expect(scenario.getValidationOutcome().outcome).toBe(ANSWER_OK);
847844

848845
// prettier-ignore
849-
validSubmissionXML = t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="prepare-for-submission"`,
846+
validSubmissionXML = t(`data id="prepare-for-submission"`,
850847
t('rep',
851848
t('inp', 'rep 1 inp')),
852849
t('rep',
@@ -883,7 +880,7 @@ describe('Form submission', () => {
883880
expect(scenario.getValidationOutcome().outcome).toBe(ANSWER_REQUIRED_BUT_EMPTY);
884881

885882
// prettier-ignore
886-
invalidSubmissionXML = t(`data xmlns="${XFORMS_NAMESPACE_URI}" id="prepare-for-submission"`,
883+
invalidSubmissionXML = t(`data id="prepare-for-submission"`,
887884
t('rep',
888885
t('inp', 'rep 1 inp')),
889886
t('rep',

packages/xforms-engine/src/parse/model/RootNamespaceDeclaration.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,18 @@ export class RootNamespaceDeclaration {
88
readonly prefix: string | null,
99
readonly namespaceURI: string | null
1010
) {
11-
let serializedName: string;
12-
1311
if (prefix == null) {
14-
serializedName = XMLNS_PREFIX;
12+
// We intentionally omit the default namespace declaration, which is
13+
// consistent with both Collect and Enketo. Including it may technically
14+
// be more "correct", but consistency ensures we don't introduce subtle
15+
// problems in any namespace-aware usage downstream.
16+
this.serializedXML = '';
1517
} else {
16-
serializedName = `${XMLNS_PREFIX}:${prefix}`;
17-
}
18-
19-
const serializedValue = escapeXMLText(namespaceURI ?? '', true);
18+
const name = `${XMLNS_PREFIX}:${prefix}`;
19+
const value = escapeXMLText(namespaceURI ?? '', true);
2020

21-
this.serializedXML = ` ${serializedName}="${serializedValue}"`;
22-
23-
this.prefix = prefix;
21+
this.serializedXML = ` ${name}="${value}"`;
22+
}
2423
}
2524

2625
serializeNamespaceDeclarationXML(): string {

0 commit comments

Comments
 (0)