XSD - validation



我的要求是这样的,请考虑以下示例 xml

<user key="username" value="Test"/>
<user key="age" value="27"/>
<user key="email" value="my@my.com"/>

在这种情况下,所有元素都具有相同的名称,相同数量的属性和相同的属性名称。

但是我需要根据验证属性。例如,这里的第一个键是用户名,其值是字符串类型,第二个键是年龄,其值必须是正整数,第三个键是电子邮件,因此值应该是电子邮件地址。

有什么办法可以做到这一点。

我多次遇到过类似的问题,

以下是我对以下帖子的接受答案:

通过 XSD 限制基于另一个元素的 XML 元素

XSD:如何根据某个标签的值验证XML文件?

您可以使用 XSL 转换将 XML 数据转换为可以使用 XSD 架构进行验证的形式。这不需要任何特殊的自定义工具。

您的输入数据:

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user key="username" value="Test"/>
    <user key="age" value="27"/>
    <user key="email" value="my@my.com"/>
</users>

可以通过以下转换进行翻译:

<?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>
    <username>Test</username>
    <age>27</age>
    <email>my@my.com</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=".+@.+.[^.]+"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

XSD 不支持这种条件验证。您需要使用Schematron。

最新更新