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>
如果表单没有数据呈现,则显示类似于:
如果表单与以下输入数据合并:
<doc>
<item>
<name>item1</name>
</item>
<item>
<name>item2</name>
</item>
<item>
<name>item3</name>
</item>
</doc>
它将呈现类似于:
正如您在表格定义代码中所注意到的那样,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表单默认执行的名称/值对。
答案 0 :(得分:0)
我猜你正在寻找的是XSLT。这使您可以将格式良好的文档转换为另一种文档。如果这是你想要的,那就有一个很好的答案here already。
答案 1 :(得分:0)
将XML转换为HTML表单的方法有很多种。这个问题听起来很像工具推荐,所以唯一要做的就是列表选项:
方法1: 该站点引导用户粘贴XML文档,然后将其转换为表单。它已经过时了,因为最后一次更改日志是在2006年。
http://www.datamech.com/XMLForm/
方法2:
您可以自行编写脚本,方法是转换XML > JSON
,然后转换JSON > HTMLForm
。
答案 2 :(得分:0)
如果其他人偶然遇到同样的问题,您可以使用xslt获得您正在寻找的内容(使用xml文档创建html)。
把这个孤独的帖子想象成你对xslt的跳跃点。如果您以前从未处理过它,那么消化可能有点困难。不要害怕。每一个旅程都从第一步开始。 (等等)
所以 - 对于你的例子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。它只是文字。只是另一个文件,你可以硬编码,嵌入,存储在文件中,从网址抓取等等。
<?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>
从上面的内容可以看出,您设置了一个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.Xml
和System.Xml.Xsl
- 两者都是System.Xml中的标准。
我知道你是一个javascript人。有些工具可以完全相同(确切地说)here和here。
我还没有使用过这些库,因为我们所有的xml都是(a)私有的,(b)位于服务器上。但是 - 我看了一下代码,他们都遵循相同的方法 - 一个xml文件和一个xslt文件,结合大约8-10行实际代码并生成一个可爱的html宝贝。
因此。就是这样。没有工具。没有第三方插件。没有疯狂的json东西。
祝你好运!不能等着看你疯了 - 孩子们创造了什么!