XSD对多个元素使用单一限制

时间:2016-10-16 09:55:16

标签: c# xml xsd xml-validation

我有一个XML文件,它是从客户系统生成的,其中十进制值以逗号而不是小数点输出,因此像10,5或1250,50而不是10.5或1250.50。 我需要对此XML文件进行验证和反序列化,因此我尝试创建一个XSD架构来进行验证,并在验证后对该文件进行反序列化。 一切正常,除了因为逗号验证数字。 我对XSD有以下限制,但我无法弄清楚如何添加限制一次并将其用于多个不同的元素,因为可能有很多带有数字的项目:

<xs:restriction base="xs:string">
   <xs:pattern value="^\d+(\,\d{1,2})?$"/>
</xs:restriction>

我尝试在下面的XSD示例中的InvoiceRow元素中添加以下块,但它似乎打破了XSD格式:

<xs:simpleType name="DecimalValidation">
  <xs:restriction base="xs:string">
    <xs:pattern value="^\d+(\,\d{1,2})?$"/>
  </xs:restriction>
</xs:simpleType>

这是我的XSD以及&#34; xs:decimal&#34;已经设置了具有数字值的项目,其中包含逗号,我需要使用限制来验证它们。

<xs:element name="InvoiceRow" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="ArticleIdentifier"/>
              <xs:element type="xs:string" name="ArticleName"/>
              <xs:element name="OrderedQuantity">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:short">
                      <xs:attribute type="xs:string" name="QuantityUnitCode" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitPriceAmount">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute type="xs:string" name="AmountCurrencyIdentifier" use="optional"/>
                      <xs:attribute type="xs:string" name="UnitPriceUnitCode" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element type="xs:short" name="RowVatRatePercent"/>
              <xs:element name="RowVatAmount">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute type="xs:string" name="AmountCurrencyIdentifier" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="RowVatExcludedAmount">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute type="xs:string" name="AmountCurrencyIdentifier" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="RowAmount">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute type="xs:string" name="AmountCurrencyIdentifier" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>

感谢有关此的任何信息或建议。

1 个答案:

答案 0 :(得分:1)

因为您的简单类型DecimalValidation已命名,它应作为全局声明(即xs:schema的子项)出现在架构的顶层,然后您应该能够通过引用xs:decimal替换对DecimalValidation的所有引用。 (看起来没有涉及名称空间,但如果有,可能需要添加合适的名称空间前缀。)