XSD 交替元素

XSD for Alternating Elements

我有以下 XML 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<main>
  <bbcor Location="string" Name="string">
    <PipeDiameter_INCH>3.1415926535</PipeDiameter_INCH>
    <InitialPressure_PSI>3335.566</InitialPressure_PSI>
    <LWISE TotalSection="2">
      <DL_FT>535.00</DL_FT>            <HL_FT>653.00</HL_FT>
      <DL_FT>245.98</DL_FT>            <HL_FT>395.0</HL_FT>
    </LWISE>
  </bbcor>
</main>

我正在尝试为上述文件制作一个 XSD 验证器,但卡在交替元素中,即

<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <HL_FT>456.00</HL_FT>
<DL_FT>6.8</DL_FT> <HL_FT>678.00</HL_FT>

我尝试了在线生成器等,但 none 提供了所需的 XSD。当前XSD文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified"
            elementFormDefault="qualified" 
            version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="main">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="bbcor">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="PipeDiameter_INCH" type="xsd:decimal" />
              <xsd:element name="InitialPressure_PSI" type="xsd:decimal" />
              <xsd:element name="LWISE">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
                    <xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
                  </xsd:sequence>
                  <xsd:attribute name="TotalSection" type="xsd:int" />
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="Location" type="xsd:string" />
            <xsd:attribute name="Name" type="xsd:string" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

以上XSD有什么问题?我正在使用 xmllint 来验证上面的 XML 文件。 XSD 是否不允许交替元素?当

之类的元素出现时它起作用了
<DL_FT>2.45</DL_FT> 
<DL_FT>2.44</DL_FT>
<DL_FT>2.35</DL_FT>
<HL_FT>245</HL_FT>
<HL_FT>445</HL_FT>
<HL_FT>545</HL_FT>

你们很亲近。只需 maxOccurs="unbounded" 分解为 xsd:sequence.

具体来说,改变

              <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
                <xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
              </xsd:sequence>

              <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="DL_FT" type="xsd:decimal" />
                <xsd:element name="HL_FT" type="xsd:decimal" />
              </xsd:sequence>

因为DL_FT-HL_FT意味着要无限期地重复。


更新:

半双

我没有提到上面的解决方案很简单只是是不对的,因为你的例子是基于对的。 (感谢 Michael Kay 的提醒。)如果您需要允许未配对的散兵游勇,例如正常配对后的单独 DL_FT 散兵游勇,

<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <-- no HL_FT here -->

您将 运行 陷入经典的、模棱两可的内容模型问题,并且无法通过 XSD 检查此类模式。然而,RELAX NG 可以表示模式。