2016-06-27 32 views
0

不確定這是否可能,但我想用xsd(版本1.1)驗證xml文檔中使用的變量是在同一文檔的不同部分中指定的。xsd根據同一文檔的不同部分驗證xml變量

我的一個文件的部分看起來像這樣:

<bf:Variables> 
    <bf:Variable name="myVariable"> 
     ... 
    </bf:Variable> 
    <bf:Variable name="AnotherOne"> 
     ... 
    </bf:Variable> 
    <bf:Variable name="evenMore"> 
     ... 
    </bf:Variable> 
    ... 
</bf:Variables> 

然後在同一文件中我還有一個部分,看起來像這樣:

<bf:Restrictions> 
    <bf:Restriction variable="myVariable" operator="="> 
     <bf:Value>True</bf:Value> 
    </bf:Restriction> 
    <bf:Restriction variable="AnotherOne" operator="="> 
     <bf:Value>False</bf:Value> 
    </bf:Restriction> 
    <bf:Restriction variable="ThirdVariable" operator="="> 
     <bf:Value>False</bf:Value> 
    </bf:Restriction> 
</bf:Restrictions> 

我的目標是檢查使用的變量在限制部分在變量部分中指定。 在上面的示例中,「ThirdVariable」應該因xsd檢查不存在於Variables部分而失敗。

回答

0

這可以通過幾種方法來解決,有些比使用其他斷言


一個更好的解決方案 - 但不是一個偉大的...

在XSD 1.1,你可以使用<xs:assert>執行此操作。理想情況下,斷言將被放置在引用元素<Restriction>上,這將明確哪個<Restriction>無效。

但是,由於<xs:assert>不能訪問值高爬在樹上的<xs:assert>必須足夠高了有<Restriction>及其範圍(兒童)內<Variable>。這樣可以,但現在你必須寫一條通用規則,如果失敗不會提供太多反饋 - 它只會告訴你一個或多個<Restriction>無效。

繼承人是一個非常快速的示例來演示。臨界CVC-斷言:斷言評價('計數(使用方法:

Visual representation of the schema made with Liquid XML Studio

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="base"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="var" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Usage" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
      <xs:assert test="count(Usage[not(./text() = ../var/text())]) = 0" /> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

示例XML

<?xml version="1.0" encoding="utf-8"?> 
<!-- Created with Liquid XML 2016 Developer Bundle Edition 14.1.4.6649 (https://www.liquid-technologies.com) --> 
<base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schema.xsd"> 
    <var>var1</var> 
    <var>var2</var> 
    <var>var4</var> 
    <Usage>var1</Usage> 
    <Usage>var2</Usage> 
    <Usage>var3</Usage><!-- INVALID --> 
</base> 

誤差(經由撒克遜)

(7 10)消息對於模式類型'#AnonType_base'上的元素'base',[not(./ text()= ../ var/text())])= 0')沒有成功。





使用更好的解決方案主要/ KeyRef的

這是XSD 1.0友好和工作得很好。它告訴你是否有重複的變量名稱,並且如果變量名稱引用無效,則指出實際問題。

Visual representation of the key keyref schema from Liquid XML Studio

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="base"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Variables"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Variable" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:simpleContent> 
             <xs:extension base="xs:string"> 
              <xs:attribute name="name" type="xs:string" /> 
             </xs:extension> 
            </xs:simpleContent> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="Restrictions"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Restriction" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:simpleContent> 
             <xs:extension base="xs:string"> 
              <xs:attribute name="variable" type="xs:string" /> 
             </xs:extension> 
            </xs:simpleContent> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:key name="VarDef"> 
      <xs:selector xpath="./Variables/Variable" /> 
      <xs:field xpath="@name" /> 
     </xs:key> 
     <xs:keyref name="VarRef" refer="VarDef"> 
      <xs:selector xpath="./Restrictions/Restriction" /> 
      <xs:field xpath="@variable" /> 
     </xs:keyref> 
    </xs:element> 
</xs:schema> 

示例XML

<?xml version="1.0" encoding="utf-8"?> 
<!-- Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com) --> 
<base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SchemaKeyRef.xsd"> 
    <Variables> 
     <Variable name="var1"></Variable> 
     <Variable name="var2"></Variable> 
     <Variable name="var3"></Variable> 
    </Variables> 
    <Restrictions> 
     <Restriction variable="var1">string</Restriction> 
     <Restriction variable="var2">string</Restriction> 
     <Restriction variable="UNKNOWN">string</Restriction> 
    </Restrictions> 
</base> 

現在所產生的誤差是更具體的,使調試問題要容易得多。

錯誤從.net(行號是壞的限制)

(12:10)中的錯誤「VarDef」 Keyref關鍵序列「未知」沒有提到一些鍵。從撒克遜

錯誤(行號是包含元素基)

(14:7)的關鍵CVC-身份constraint.4.3:密鑰 'VarRef' 具有值 '未知' 未找到身份元素'base'的約束。