如果特定属性具有值(非空白),则必须存在XML元素

时间:2015-04-21 17:11:27

标签: xml xsd

我正在研究一些我应该包含特定XML元素的东西,只有当某些属性的值存在时(非空白)。

例如:

<Students> 
  <Student> 
   <Name First = "Robin" Last = "Douglas"/> 
   <Address StreetApt="1234, Test St" City= "Kansas City" State = "MO" />    
   <Results Year="2015" Sem="Spring" GPA="3.5"/> 
  </Student> 
  <Student> 
   <Name First = "Sam" Last = "Evans"/> 
   <Address StreetApt="5678, Test Blvd" City= "Kansas City" State = "MO" /> 
   <Results Year="2015" Sem="Spring" GPA="3.9"> 
  </Student> 
  <Student> 
   <Name First = "Zack" Last = "Roberts"/> 
   <Address StreetApt="9078, Test Ave" City= "Kansas City" State = "MO" /> 
   <Results Year="2015" Sem="Spring" GPA=""> 
  </Student> 
</Students>

因此,在上面的示例中,如果您注意到,GPA标记中的<Results />属性为最后一个学生(名为&#34; Zack Roberts&#34;),则不包含任何数据。因此,要求是该特定属性为空,然后我必须删除该特定学生的整个<Results />标记。因此,期望的结果将是:

<Students> 
  <Student> 
   <Name First = "Robin" Last = "Douglas"/> 
   <Address StreetApt="1234, Test St" City= "Kansas City" State = "MO" />    
   <Results Year="2015" Sem="Spring" GPA="3.5"/> 
  </Student> 
  <Student> 
   <Name First = "Sam" Last = "Evans"/> 
   <Address StreetApt="5678, Test Blvd" City= "Kansas City" State = "MO" /> 
   <Results Year="2015" Sem="Spring" GPA="3.9"> 
  </Student> 
  <Student> 
   <Name First = "Zack" Last = "Roberts"/> 
   <Address StreetApt="9078, Test Ave" City= "Kansas City" State = "MO" /> 
  </Student> 
</Students>

请告诉我如何实现这一目标? 我尝试在XSD中使用minOccursmaxOccurs,但后来意识到这些是不用于此目的。

我的首要任务是对XSD进行一些更改并尝试实现结果。如果不可能那样,那么另一种可能的方式是什么?

请注意: 我已经提到了上面提到的一个例子。我正在处理的实时数据标签如下:

<OrganizationId ImportAction="addModify" Type="GLN" Identifier="1234567890123" Primary="false" StartDate="2000-01-01"/>

该要求提到如果Identifier具有13位数值(13位数字),则仅保留<OrganizationId>标记。在所有其他情况下,<OrganizationId>标记不应出现。在我正在运行以生成此XML的Scribe作业中,我保留所有13位数值,否则用&#34;&#34;替换这些值。所以,如果你对我的特定情况有任何其他解决方案,那么我也欢迎这些!

1 个答案:

答案 0 :(得分:1)

正如Mathias所提到的,不是考虑操纵XML(“删除”)而是考虑有效性。您已经说明了您的要求,Results如果没有非空@GPA则不应该出现。因此,我们要求GPA:

                  <xs:attribute name="GPA" use="required">

并且非空:

                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                      </xs:restriction>
                    </xs:simpleType>

然后:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Students">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Student" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Results" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence/>
                  <xs:attribute name="GPA" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

(为清楚起见,省略了非必要组件。它们的添加应该是直截了当的。)