限制 XSD 中所有子元素的最大字符数

Limit max character count across all child elements in XSD

我有这个代码:

<desc> 
    <paragraphe>bala bla bla</paragraphe>
    <paragraphe>bala bla bla bla</paragraphe>
    <paragraphe>bala bla bla</paragraphe>
</desc>

我想限制 desc 元素的最大长度为 120 个字符,仅包括所有 paragraphe 内容。

例如,对于单个 paragraphe 元素,我可以针对 40 个字符的固定最大长度执行此操作:

<xs:element name="paragraphe">
   <xs:simpleType>
       <xs:restriction base="xs:string">
           <xs:maxLength value="40"/>
       </xs:restriction>
   </xs:simpleType>
</xs:element>

但我想将 desc 的长度(总共 paragraphe 个字符)限制为 120 个字符。

您可以在 XSD 1.1 中使用 xs:assert

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           elementFormDefault="qualified"
           vc:minVersion="1.1">
    <xs:element name="desc">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="paragraphe" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:assert test="string-length(string-join(paragraphe, '')) &lt; 12"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

那么这个XML文件就会有效:

<desc>
    <paragraphe>asdf</paragraphe>
    <paragraphe>asdf</paragraphe>
    <paragraphe>asd</paragraphe>
</desc>

而这个XML文档将无效:

<desc>
    <paragraphe>asdf</paragraphe>
    <paragraphe>asdf</paragraphe>
    <paragraphe>asdf</paragraphe>
</desc>

(测试后将12改为120即可)