Account
English

PEPPOL-EN16931-R008: Document contains empty elements

Peppol BIS Billing 3.0 rule · Error · UBL / CII

StandardPeppol BIS Billing 3.0 (OpenPeppol)SeverityError: the invoice is rejectedSyntaxUBL, CIIApplies toInvoices and credit notes sent over the Peppol network (UBL) and, because XRechnung embeds the Peppol rule set, every XRechnung as well.

Official rule text

[PEPPOL-EN16931-R008] Document MUST not contain empty elements.

Why this error occurs

Peppol forbids elements that have neither child elements nor text content, because an empty element is ambiguous (is the value missing or intentionally blank?) and breaks downstream processing. The rule flags every element matching //*[not(*) and not(normalize-space())], in CII with an exception for ram:ApplicableHeaderTradeDelivery, which may be empty. Empty elements almost always come from templates that emit every optional tag and fill it only when data exists, e.g. <cbc:Note/>, <cbc:Telephone></cbc:Telephone> or an empty <cac:Delivery/>.

How to fix it

Generate optional elements only when you have a value: wrap each optional tag in a condition in your template or serialiser. Remove whitespace-only values, as they count as empty. Check containers too: a <cac:Contact/> with no children or a <cac:PartyIdentification><cbc:ID/></cac:PartyIdentification> both fail. Run the output through the validator again, since removing one empty child can leave an empty parent.

Example (valid)

<cac:Contact>
  <cbc:Name>Accounts receivable</cbc:Name>
  <cbc:ElectronicMail>invoice@muster-gmbh.de</cbc:ElectronicMail>
</cac:Contact>

What the validator checks

Checked element (context):

UBL

//*[not(*) and not(normalize-space())]

Test (XPath):

false()

CII

//*[not(name() = 'ram:ApplicableHeaderTradeDelivery') and not(*) and not(normalize-space())]

Test (XPath):

false()

Check your invoice

Drop your XML or PDF on the validator and every failed rule is linked to its page here. Free, no account, the file is not stored.

Check your invoice →

Same check via API:

curl -F file=@invoice.xml https://einvoicechecker.com/v1/validate

Related rules

Frequently asked questions

What does PEPPOL-EN16931-R008 mean?

PEPPOL-EN16931-R008 is a peppol bis billing 3.0 rule: Document MUST not contain empty elements.

Will my invoice be rejected because of PEPPOL-EN16931-R008?

Yes. PEPPOL-EN16931-R008 is flagged "fatal"; validators (KoSIT, Peppol access points, the German ZRE/OZG-RE portals) reject the invoice until it is fixed.

Which formats does PEPPOL-EN16931-R008 apply to?

Invoices and credit notes sent over the Peppol network (UBL) and, because XRechnung embeds the Peppol rule set, every XRechnung as well. Syntax: UBL and CII.

Source: Peppol BIS Billing 3.0.20 (November 2025). Catalogue generated from the official schematron on 2026-10-14.