我的要求是这样的,请考虑以下示例 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。