0

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

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

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

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

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

4

3 回答 3

1

You can translate your XML data with a XSL transformation into a form which can be validated with a XSD schema. This does not require any special custom tools.

Your input data:

<?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>

Can be translated with the following transformation:

<?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>

into the following form:

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

And that can easily be validated with a standard XSD schema:

<?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>
于 2012-07-05T14:53:32.053 回答
1

我多次遇到类似的问题,

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

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

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

于 2012-07-05T13:06:54.257 回答
0

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

于 2012-07-04T14:16:06.043 回答