从xsd模式引用spring bean值

时间:2014-06-10 16:10:14

标签: xml spring xslt xsd

我正在尝试编写包含验证的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>

但我无法让导入工作。据我所知,importinclude标签只允许使用其他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?

1 个答案:

答案 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