我正在尝试编写包含验证的xml架构xsd(字符串的模式,int的min / max等)。我希望验证的限制依赖于外部xml配置文件(spring beans文件)。
例如在beans / config文件中,我有以下内容:
....
<bean id=bean1 class="com.example.package.Class1">
<property name=validation value="[a-zA-Z]">
</bean>
...
在我的xsd架构中,我想引用验证属性作为匹配字符串的模式。
我理想地喜欢以下内容:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="elementToValidate">
<xsd:restriction base="xsd:string">
<xsd:pattern ref="bean1/validation" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
但我无法让导入工作。据我所知,import
和include
标签只允许使用其他xsd文件扩展架构,而不是其他xml。使用
<import resource="path/to/file.xml"/>
似乎也不起作用。
有没有办法做到这一点,还是我需要围绕它寻找其他方法? 感谢
编辑:感谢@helderdarocha的回答。这凸显了另一个类似的问题。有没有办法从xml访问值以用于验证文件的其余部分?例如,
<xmlNode>
<property name="prop1">3</property>
<property name="prop2">4</property>
</xmlNode>
确保prop2> prop1或以其他方式使用prop1的值来验证prop2?
答案 0 :(得分:3)
使用XSLT,您可以生成XSD,从beans.xml
文件中提取所选数据,并将它们放在任何您想要的位置。您还可以执行更多额外处理,修改数据等。
我假设你有一个beans.xml
这样的文件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="bean1" class="com.example.package.Class1">
<property name="validation" value="[a-zA-Z]"/>
</bean>
<bean id="bean2" class="com.example.package.Class2">
<property name="validation" value="[0-9]"/>
</bean>
</beans>
使用上面的spring.xml
作为输入源,以及下面的XSLT样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:spring="http://www.springframework.org/schema/beans"
exclude-result-prefixes="spring">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsd:schema elementFormDefault="qualified">
<xsl:apply-templates select="//spring:property"/>
</xsd:schema>
</xsl:template>
<xsl:template match="spring:property[@name='validation']">
<xsd:simpleType name="{parent::spring:bean/@id}-validation-rule">
<xsd:restriction base="xsd:string">
<xsd:pattern ref="{@value}" />
</xsd:restriction>
</xsd:simpleType>
</xsl:template>
</xsl:stylesheet>
您将生成此XSD文档:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:simpleType name="bean1-validation-rule">
<xsd:restriction base="xsd:string">
<xsd:pattern ref="[a-zA-Z]"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="bean2-validation-rule">
<xsd:restriction base="xsd:string">
<xsd:pattern ref="[0-9]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
有关实时工作示例,请参阅此 XSLT Fiddle 。