HTML表单是否可以由XML文档支持?

时间:2018-04-18 15:26:36

标签: javascript html xml forms

HTML表单是否可以绑定到XML文档?

为了给出一些上下文,Adobe XFA表单是为了呈现为PDF表单而创建的XML文档。它们支持非常类似于我所寻找的XML绑定,但我不知道HTML表单中的任何类似内容并寻求建议。

XFA表单还可以定义绑定到其表单字段的XML文档的绑定。架构没有必要定义 -  表单可以与XML数据合并,也可以根据表单中指定的绑定生成XML数据。

示例表单定义:

<subform layout="tb">
    <bind match="dataRef" ref="$.doc" />
    <field w="0.5in">
        <bind match="none" />
        <ui>
            <button />
        </ui>
        <caption>
            <value>Add</value>
        </caption>
        <event activity="click" name="event__click">
            <script contentType="application/x-javascript">
               this.resolveNode("itemList").instanceManager.addInstance();
            </script>
        <event>
    </field>
    <subform layout="tb" name="itemList">
        <bind match="dataRef" ref="$.item[*]">
        <occur min="1" max="-1" />
        <field w="2in">
            <bind match="dataRef" ref="$.name" />
            <ui>
                <textEdit />
            </ui>
            <caption>
                <value>Name</value>
            </caption>
        </field>
    </subform>
</subform>

如果表单没有数据呈现,则显示类似于:

enter image description here

如果表单与以下输入数据合并:

<doc>
   <item>
       <name>item1</name>
   </item>
   <item>
       <name>item2</name>
   </item>
   <item>
       <name>item3</name>
   </item>
</doc>

它将呈现类似于:

enter image description here

正如您在表格定义代码中所注意到的那样,Adobe XFA表单使用自己的XML语言和表达式语法,称为SOM表达式。第一个绑定$.doc绑定到顶级根节点名doc

下一个绑定$.item[*]subform元素嵌套,并且与$.doc绑定相关。

子表单元素是一个容器,类似于HTML div元素。

子表单绑定到根item元素下的doc个元素。 [*]语法意味着子表单将为xml文档中的每个item元素重复。

子表单元素中的occur元素进一步限定了可以发生的实例数。 min=1表示即使数据中没有项目元素合并到表单中,它也会自动生成一个。 max=-1表示项目实例数没有限制。

field元素绑定到$.name。这意味着它的值将更新(或创建)当前name下的item元素。

表单中的“添加”按钮创建新实例,Adobe Reader具有内置的Javascript引擎和自己的API,用于管理表单实例,这些实例将持久保存回绑定到表单的XML数据。

当然,也可以从保存的PDF表单中提取XML数据。

XFA表单中还有更多功能,例如条件绑定,但我很好奇HTML表单中是否存在这些行,或许某些库可以将表单链接到XML文档并以类似的方式定位它们

XPATH是理想的,而不是Adobe SOM表达式语法。此外,理想的做法是从表单中发布XML,而不是HTML表单默认执行的名称/值对。

3 个答案:

答案 0 :(得分:0)

我猜你正在寻找的是XSLT。这使您可以将格式良好的文档转换为另一种文档。如果这是你想要的,那就有一个很好的答案here already

答案 1 :(得分:0)

将XML转换为HTML表单的方法有很多种。这个问题听起来很像工具推荐,所以唯一要做的就是列表选项:

方法1: 该站点引导用户粘贴XML文档,然后将其转换为表单。它已经过时了,因为最后一次更改日志是在2006年。

http://www.datamech.com/XMLForm/ enter image description here

方法2: 您可以自行编写脚本,方法是转换XML > JSON,然后转换JSON > HTMLForm

  1. 将XML转换为JSON工具:
  2. 将JSON转换为表单工具:

答案 2 :(得分:0)

如果其他人偶然遇到同样的问题,您可以使用xslt获得您正在寻找的内容(使用xml文档创建html)。

把这个孤独的帖子想象成你对xslt的跳跃点。如果您以前从未处理过它,那么消化可能有点困难。不要害怕。每一个旅程都从第一步开始。 (等等)

从xml开始,以及您想要创建的html的一些想法

所以 - 对于你的例子XML:

<doc>
    <item name="Item1" />
    <item name="Item2" />
    <item name="Item3" />
</doc>

假设你想创建一个相当简单的HTML snippit:

<form class="tb">
    <div><a class="btn btn-primary">Add</a></div>
    <ul>
        <li><label>Name</label><input type="text" class="form-control" value="Item1" /></li>
        <li><label>Name</label><input type="text" class="form-control" value="Item2" /></li>
        <li><label>Name</label><input type="text" class="form-control" value="Item3" /></li>
    </ul>
</form>

接下来,构建您的Xslt

一开始就有一些工作,还有一些要学习的语法。但是,如果我们切入追逐,这就是你最终会得到的xslt。它只是文字。只是另一个文件,你可以硬编码,嵌入,存储在文件中,从网址抓取等等。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" />
<xsl:template match="doc">
<form class="tb">
    <div><a class="btn btn-primary">Add</a></div>
    <ul>
        <xsl:for-each select="item">
           <li><label>Name</label><input type="text" class="form-control" value="<xsl:value-of select="@name"/>" /></li>
        </xsl:for-each>
        <xsl:if test="count(item)=0">
           <li><label>Name</label><input type="text" class="form-control" value="" /></li>
        </xsl:if>
    </ul>
</form>
</xsl:template>

一些Xslt Notes

从上面的内容可以看出,您设置了一个BASE文档节点以使用<xsl:template match="doc">标记进行循环。如果您的xml文档具有doc节点,则包含模板中的html。如果没有doc个节点,则会跳过该节点。

您可以将xslt分解为不同的模板 - 并将它们包含在主模板中。这很酷。

在上面的示例中,我们使用item标记循环您的<xsl:for-each>节点,我们甚至还有一个&#34;替代&#34;如果有ZERO item标签,那么会显示html(包含空输入标签的是 <xsl:if test="count(item)=0">)。

有一些非常好的xslt引用,但我喜欢Microsoft中的那个,因为我可以使用下面的c#代码从特定的xslt tempate和我的xml doc获取html。

最后,把它们放在一起

一旦你有你的xml(上面)和你的xslt(也在上面),你可以使用它们来生成一个html字符串,这个html就像你一样长而复杂。这是我们用来从xslt和非常复杂的xml文档生成大量抵押合同的方法的几乎逐字的副本。我发誓 - 它的闪电很快,每天为我们制作数千页的HTML。

private string GetHtmlFromXslt(string xml, string xslt) {
    XslCompiledTransform transform = new XslCompiledTransform();
    using (XmlReader reader = XmlReader.Create(new StringReader(xslt))) {
        transform.Load(reader);
    }
    StringWriter results = new StringWriter();
    using (XmlReader reader = XmlReader.Create(new StringReader(xml))) {
        transform.Transform(reader, null, results);
    }
    return results.ToString();
}

这是一个.net核心项目文件,仅引用System.XmlSystem.Xml.Xsl - 两者都是System.Xml中的标准。

C-锋利!?布莱什!乙酰胆碱! OP说JAVASCRIPT。哎呀...

我知道你是一个javascript人。有些工具可以完全相同(确切地说)herehere

我还没有使用过这些库,因为我们所有的xml都是(a)私有的,(b)位于服务器上。但是 - 我看了一下代码,他们都遵循相同的方法 - 一个xml文件和一个xslt文件,结合大约8-10行实际代码并生成一个可爱的html宝贝。

因此。就是这样。没有工具。没有第三方插件。没有疯狂的json东西。

祝你好运!不能等着看你疯了 - 孩子们创造了什么!