0

私の要件は、次のサンプルxmlを検討してください

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

この場合、同じ名前、同じ数の属性、同じ属性名を持つすべての要素も..

しかし、 keyに従ってvalue属性を検証する必要があります。たとえば、最初のキーはユーザー名で、その値は文字列型、2 番目のキーは年齢、その値は正の整数、3 番目のキーは電子メールであるため、値は電子メール アドレスである必要があります。

これを達成する方法はありますか。

4

3 に答える 3

1

似たような質問を何回か見たことがありますが、

以下は、次の投稿に対する私の受け入れられた回答です。

XSD による別の要素に基づく XML 要素の制限

XSD: タグの値に従って XML ファイルを検証する方法は?

于 2012-07-05T13:06:54.257 に答える
1

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>
于 2012-07-05T14:53:32.053 に答える
0

XSD は、この種の条件付き検証をサポートしていません。Schematronを使用する必要があります。

于 2012-07-04T14:16:06.043 に答える