Xslt 将web表单数据映射到重复的XML元素
我在网上到处寻找答案,但在任何地方都找不到 我正在尝试构建一个web表单,它使用Xslt 将web表单数据映射到重复的XML元素,xslt,webforms,xml-parsing,xsd,xml-serialization,Xslt,Webforms,Xml Parsing,Xsd,Xml Serialization,我在网上到处寻找答案,但在任何地方都找不到 我正在尝试构建一个web表单,它使用XSLT生成XML数据。我基于做同样事情的其他形式,并且已经让小的测试结构很好地工作。然而,当我试图将它映射到重复的元素时,我遇到了各种各样的问题 下面是我所拥有的内容的简要概述。我有一个与此类似的XSLT文件(免责声明:为简洁起见,排除了行;此外,这些不是实际的字段名): 我还有一个关联的模式,如下所示: <xs:element name="Name" /> <xs:element name=
XSLT
生成XML
数据。我基于做同样事情的其他形式,并且已经让小的测试结构很好地工作。然而,当我试图将它映射到重复的元素时,我遇到了各种各样的问题
下面是我所拥有的内容的简要概述。我有一个与此类似的XSLT
文件(免责声明:为简洁起见,排除了行;此外,这些不是实际的字段名):
我还有一个关联的模式,如下所示:
<xs:element name="Name" />
<xs:element name="Address" />
<xs:element name="Plan" maxOccurs="10">
<xs:complexType>
<xs:sequence>
<xs:element name="Step" />
<xs:element name="Description" />
</xs:sequence>
</xs:complexType>
</xs:element>
<input type="text" id="getName" xpath="/*[local-name()='Name']">
<input type="text" id="getAddress" xpath="/*[local-name()='Address']">
<table>
<tr><th>Step</th><th>Description</th></tr>
<tr>
<td><input type="text" id="getStep1" xpath="/*[local-name()='Plan']/*[local-name()='Step']"></td>
<td><input type="text" id="getDesc1" xpath="/*[local-name()='Plan']/*[local-name()='Description']"></td>
</tr>
</table>
记下计划元素中的“maxOccurs='10'”!这就是我遇到问题的地方强>
我写了一个表单(同样基于其他工作表单),如下所示:
<xs:element name="Name" />
<xs:element name="Address" />
<xs:element name="Plan" maxOccurs="10">
<xs:complexType>
<xs:sequence>
<xs:element name="Step" />
<xs:element name="Description" />
</xs:sequence>
</xs:complexType>
</xs:element>
<input type="text" id="getName" xpath="/*[local-name()='Name']">
<input type="text" id="getAddress" xpath="/*[local-name()='Address']">
<table>
<tr><th>Step</th><th>Description</th></tr>
<tr>
<td><input type="text" id="getStep1" xpath="/*[local-name()='Plan']/*[local-name()='Step']"></td>
<td><input type="text" id="getDesc1" xpath="/*[local-name()='Plan']/*[local-name()='Description']"></td>
</tr>
</table>
步骤说明
这很好用;我能够提交数据,它可以根据我的需要创建XML
然而,我的问题是:我正在尝试编写我的设置,以便它最多可以容纳十行(根据maxOccurs设置)。当我尝试这样做时,它将不起作用:
<tr>
<td><input type="text" id="getStep1" xpath="/*[local-name()='Plan']/*[local-name()='Step']"></td>
<td><input type="text" id="getDesc1" xpath="/*[local-name()='Plan']/*[local-name()='Description']"></td>
</tr>
<tr>
<td><input type="text" id="getStep2" xpath="/*[local-name()='Plan']/*[local-name()='Step']"></td>
<td><input type="text" id="getDesc2" xpath="/*[local-name()='Plan']/*[local-name()='Description']"></td>
</tr>
这给了我各种各样的问题,取决于我如何调整它。有时,它不保存任何数据(用于步骤和说明);有时,它会为两行保存相同的数据
我还没有找到任何文档来解释它是如何工作的。我调整了XSLT
、HTML
和schema
,但都没有效果。这让我很沮丧
有人知道如何解决这个问题吗
注:这与我之前提出的另一个问题直接相关:
提前感谢您的帮助 您需要为每个tr指定您想要的计划元素,即第一个tr需要获得第一个计划,依此类推。 为此,您可以在
[local-name()='Plan']
谓词中使用position()函数,例如:
[local-name()='Plan' and position()=1]
对于第一个tr
[local-name()='Plan' and position()=2]
对于第二个tr,依此类推
这应该可以让您开始,但您也可以通过循环到输出tr元素来使代码更智能
当您指定节点树(即节点集合)时,问题中的示例XPath将返回所有步骤或描述元素。position功能允许您在节点树中选择单个节点。以下是我最终实现此功能的方法:
<tr>
<td><input type="text" id="getStep1" xpath="/*[local-name()='Plan'][1]/*[local-name()='Step']"></td>
<td><input type="text" id="getDesc1" xpath="/*[local-name()='Plan'][1]/*[local-name()='Description']"></td>
</tr>
<tr>
<td><input type="text" id="getStep2" xpath="/*[local-name()='Plan'][2]/*[local-name()='Step']"></td>
<td><input type="text" id="getDesc2" xpath="/*[local-name()='Plan'][2]/*[local-name()='Description']"></td>
</tr>
如果您查看xpath,请注意“Plan”之后的[1]和[2]。当我将它们包含在xpath中时,它工作起来没有问题。我将尝试一下,看看会发生什么。Re:循环到输出:这正是我想要的。最大值不是10;实际上是100,我不打算写那么多元素。然而,我想确保在我编程任何循环输出元素之前,我可以首先让它工作。你每天都会学到一些东西,我没有意识到位置可以缩短为数字。是的,我在某处(不记得在哪里)遇到了一个使用这种语法的示例。我试过了,瞧。