如何在XSD的simpleType中自定义规则,忽略<br>标签校验字符长度
解决XSD校验时忽略
<br>标签统计字符的方案 你的核心问题在于:原XSD把product_long_description当成纯字符串类型,但实际上它是混合内容(文本+<br>子元素),而且需要忽略<br>来统计文本长度。XSD 1.0无法直接实现这种自定义校验,必须使用XSD 1.1的断言(xs:assert)特性来完成。
修正后的XSD实现方案
<xsd:element name="product_long_description"> <xsd:annotation> <xsd:documentation>Long Description of Product</xsd:documentation> </xsd:annotation> <xsd:complexType mixed="true"> <xsd:sequence> <!-- 允许任意数量的<br>标签,可分布在文本任意位置 --> <xsd:element name="br" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <!-- 自定义断言:计算去掉所有<br>后的文本长度不超过4000 --> <xsd:assert test="string-length(translate(., '<br>', '')) <= 4000"/> </xsd:complexType> </xsd:element>
代码说明
- 混合内容声明:通过
mixed="true"标记该元素允许文本与<br>子元素混合存在,同时用minOccurs="0"和maxOccurs="unbounded"放开<br>标签的数量限制。 - 断言校验逻辑:
translate(., '<br>', ''):将元素内容中的<br>字符串替换为空,彻底移除所有<br>标签的字符占用。string-length(...) <= 4000:计算处理后的纯文本长度,确保不超过4000字符限制。- 若需要去除文本前后空格或中间多余空白,可在
translate外层包裹normalize-space(),即string-length(normalize-space(translate(., '<br>', ''))) <= 4000。
注意事项
- 该方案依赖XSD 1.1标准,需使用支持XSD 1.1的校验工具,比如Saxon系列、Xerces2-J(需手动开启XSD 1.1支持)。
- 若必须兼容XSD 1.0,只能通过额外的自定义代码(如Java/Python脚本)补充校验逻辑,XSD 1.0本身无法实现忽略特定标签的长度统计。
内容的提问来源于stack exchange,提问作者Suman Shekhar
相关产品推荐
相关产品推荐

