如何指定一个元素以具有一个属性,该属性说明它在 XML 模式中包含多少个子元素?

Posted

技术标签:

【中文标题】如何指定一个元素以具有一个属性,该属性说明它在 XML 模式中包含多少个子元素?【英文标题】:How can I specify an element to have an attribute that states how many children it contains in an XML Schema? 【发布时间】:2011-09-18 05:49:16 【问题描述】:

有可能吗?

我知道可以根据正则表达式进行限制,但不是这样 我知道可以将属性声明为由 XPath 计算的外键,但它似乎必须是唯一的

示例:

<root children="2">
    <child />
    <child />
</root>

【问题讨论】:

【参考方案1】:

XSD 1.1 允许您表达这种约束:

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="child" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="children" type="xs:integer"/>
  </xs:complexType>
  <xs:assert test="@children = count(child)"/>
</xs:element>

XSD 1.1 目前在 Saxon 和 Xerces 中实现。

【讨论】:

【参考方案2】:

W3C Schema 1.0 无法根据实例文档限制属性值。

Schematron 是用于验证文档是否符合此类自定义验证方案的出色工具。

例如:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
    <pattern>
        <rule context="root[@children]">
            <assert 
                id="children-value" 
                test="@children=count(child)" 
                flag="error">
                The root/@children value must be equal to the number of child elements.
                </assert>
            </rule>
    </pattern>
</schema>

【讨论】:

以上是关于如何指定一个元素以具有一个属性,该属性说明它在 XML 模式中包含多少个子元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取具有指定href属性的所有元素

jQuery:如何选择具有包含 x 属性的子元素或元素?

如何从具有所有属性的页面复制canvas元素?

zset类型以及其操作

如何搜索 xml 节点值,然后在 c# 中为该元素创建新属性

如何在 TypeScript 类中正确声明计算属性名称?