从简单的XSD文件生成HTML表单-javascript?

从简单的XSD文件生成HTML表单-javascript?,javascript,html,forms,xsd,Javascript,Html,Forms,Xsd,我有一个简单的XSD文件,如下所示: <?xml version="1.0" standalone="yes"?> <xs:schema id="Employee" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Employee" msdata:IsDataSet

我有一个简单的XSD文件,如下所示:

<?xml version="1.0" standalone="yes"?>
<xs:schema id="Employee" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Employee" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Employees">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" minOccurs="0" />
              <xs:element name="Birth Date" type="xs:dateTime" minOccurs="0" />
              <xs:element name="Nationality" type="xs:string" minOccurs="0" />
              <xs:element name="Profession" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

我想根据这个XSD信息生成一个HTML表单


有什么建议吗?我正在考虑使用Javascript读取XSD文件并从中生成表单。有可能吗?

免责声明:我是一个开源库的作者,该库适合使用Javascript阅读此任务的XSD文件

Jsonix可以根据特定的XML模式解析XML。由于XML模式有一个语法,所以可以使用Jsonix解析XSD。然后需要基于解析的JSON构建HTML表单(这是Jsonix不提供进一步帮助的地方)

这是一个例子

考虑:


您可以使用Jsonix解析这个XSD文件并迭代元素。下面是一段代码片段:

var context=newjsonix.context([XSD_1_0]);
var unmarshaller=context.createUnmarshaller();
unmarshaller.unmarshaller文件(“tests/XSD/1.0/Schema-01.xml”,函数(结果){
var schema=result.value;
var tns=schema.targetNamespace;
var complexTypes=schema.complexType;
var-featureTypes={};
对于(var index=0;index
此特定测试使用Node.js运行,但Jsonix本身也在浏览器中运行

注:

  • 是XSD解决方案中现有的UI之一
  • 考虑JSON模式而不是XML模式,这将省去XSD解析
  • XML模式可能非常复杂,您可以合理地只支持其中的一部分
  • 如果事先知道XSD,可以考虑编译时工具来处理模式。在浏览器中处理XSD可能相当繁重,并且只有在高级中不知道您的XSD时才有意义,例如在运行时的deliveren(例如,从某些web服务)
  • 是另一个从原理图定义(不是XML原理图,而是基于XML)动态构建Web UI的工具示例。它实际上在下面使用了Jsonix

    • 我知道这是一个老问题,但我自己也遇到了这个问题,找不到令人满意的开源解决方案。我最终编写了自己的实现。它自动从XSD生成HTML5表单。它支持大多数XSD标准,包括元素、属性、minOccurs和maxOccurs


      如果您更喜欢开箱即用的解决方案,而不是编写自己的解决方案,请参阅我的实现。

      当然这是可能的,但坦白说,不值得自动化,除非您考虑的是更大或更多的XSD。即使如此,XSLT转换也可能比JavaScript更容易。另请参见:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsd:schema xmlns:gml="http://www.opengis.net/gml" xmlns:nasa="http://nasa.gov" xmlns:ne="http://naturalearthdata.com" xmlns:nurc="http://www.nurc.nato.int" xmlns:og="http://opengeo.org" xmlns:osm="http://openstreemap.org" xmlns:topp="http://www.openplans.org/topp" xmlns:usgs="http://www.usgs.gov/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.openplans.org/topp">
        <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://demo.opengeo.org:80/geoserver/schemas/gml/3.1.1/base/gml.xsd"/>
        <xsd:complexType name="tasmania_state_boundariesType">
          <xsd:complexContent>
            <xsd:extension base="gml:AbstractFeatureType">
              <xsd:sequence>
                <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
                <xsd:element maxOccurs="1" minOccurs="0" name="STATE" nillable="true" type="xsd:string"/>
                <xsd:element maxOccurs="1" minOccurs="0" name="COUNTRY" nillable="true" type="xsd:string"/>
                <xsd:element maxOccurs="1" minOccurs="0" name="CURR_TYPE" nillable="true" type="xsd:string"/>
                <xsd:element maxOccurs="1" minOccurs="0" name="CURR_CODE" nillable="true" type="xsd:string"/>
              </xsd:sequence>
            </xsd:extension>
          </xsd:complexContent>
        </xsd:complexType>
        <xsd:element name="tasmania_state_boundaries" substitutionGroup="gml:_Feature" type="topp:tasmania_state_boundariesType"/>
      </xsd:schema>
      
      var context =  new Jsonix.Context([XSD_1_0]);
          var unmarshaller = context.createUnmarshaller();
          unmarshaller.unmarshalFile("tests/XSD/1.0/Schema-01.xml", function(result) {
      
              var schema = result.value;
              var tns = schema.targetNamespace;
              var complexTypes = schema.complexType;
      
              var featureTypes = {};
              for (var index = 0; index < complexTypes.length; index++)
              {
                  var featureType = {};
                  var complexType = complexTypes[index];
                  var name = complexType.name;
                  var qname = new Jsonix.XML.QName(tns, name);
                  featureType.typeName = qname;
      
                  featureTypes[qname.key] = featureType;
      
      
                  var elements = [];
      
                  if (complexType.complexContent && complexType.complexContent.extension && complexType.complexContent.extension.sequence && complexType.complexContent.extension.sequence.element)
                  {
                      elements = elements.concat(complexType.complexContent.extension.sequence.element);
                  }
      
                  if (complexType.sequence && complexType.sequence.element)
                  {
                      elements = elements.concat(complexType.sequence.element);
                  }
                  featureType.properties = {};
      
                  for (var jndex = 0; jndex < elements.length; jndex++)
                  {
                      var element = elements[jndex];
                      var property = {
                          name: new Jsonix.XML.QName(tns, element.name),
                          type: element.type,
                          collection: (element.maxOccurs === 'unbounded')
                      };
                      featureType.properties[element.name] = property;
                  }
              }
      
              var featureElements = {};
      
              for (var kndex = 0; kndex < schema.element.length; kndex++)
              {
                  var topLevelElement = schema.element[kndex];
                  featureElements[topLevelElement.name] = featureTypes[topLevelElement.type.key];
              }
      
              console.log(featureElements);
              test.done();
          });