2012-07-04 50 views
0

我的要求是一樣,考慮下面的示例XMLXSD - 驗證

<user key="username" value="Test"/> 
<user key="age" value="27"/> 
<user key="email" value="[email protected]"/> 

在這種情況下,所有的元素具有相同的名稱,相同數量的屬性和相同屬性的名稱太..

但我需要驗證屬性根據密鑰。例如,這裏第一個鍵是用戶名,它的值是一個字符串類型,第二個鍵是年齡,它的值必須是一個正整數,第三個鍵是電子郵件,因此該值應該是一個電子郵件地址。

有沒有什麼辦法可以做到這一點。

回答

0

XSD不支持這種條件驗證。您需要使用Schematron

1

您可以使用XSL轉換XML數據轉換爲可以使用XSD模式進行驗證的表單。這不需要任何特殊的定製工具。

輸入數據:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/users"> 
     <users> 
      <xsl:apply-templates/> 
     </users> 
    </xsl:template> 
    <xsl:template match="//user"> 
     <xsl:variable name="key" select="@key"/> 
     <xsl:variable name="value" select="@value"/> 
     <xsl:element name="{$key}"> 
      <xsl:value-of select="$value"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

爲以下形式:

<?xml version="1.0" encoding="UTF-8"?> 
<users> 
    <user key="username" value="Test"/> 
    <user key="age" value="27"/> 
    <user key="email" value="[email protected]"/> 
</users> 

可以用下面的變換來翻譯

<?xml version="1.0" encoding="UTF-8"?> 
<users> 
    <username>Test</username> 
    <age>27</age> 
    <email>[email protected]</email> 
</users> 

而且可以很容易地與驗證標準XSD架構:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="users"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="username" type="xs:string"/> 
       <xs:element name="age" type="xs:positiveInteger"/> 
       <xs:element name="email"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:pattern value="[email protected]+\.[^.]+"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema>