【问题标题】:Mapping web form data to repeated XML elements将 Web 表单数据映射到重复的 XML 元素
【发布时间】:2014-03-22 03:51:03
【问题描述】:

我在网上到处寻找这个问题的答案,但在任何地方都找不到。

我正在尝试构建一个使用XSLT 生成XML 数据的网络表单。我将它基于做同样事情的其他形式,并让小型测试结构正常工作。但是,当我尝试将其映射到重复元素时遇到了各种问题。

这里是我所拥有的快速概览。我有一个类似于此的XSLT 文件(免责声明:为简洁起见排除了行;此外,这些不是实际的字段名称):

<someForm:Name></someForm:Name>
<someForm:Address></someForm:Address>
<someForm:Plan>
    <someForm:Step></someForm:Step>
    <someForm:Description></someForm:Description>
</someform:Plan>

我还有一个如下所示的关联架构:

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

记下 Plan 元素中的“maxOccurs='10'”!这就是我遇到问题的地方!

我写了一个表格(同样,基于其他工作表格),如下所示:

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

这给了我各种各样的问题,这取决于我如何调整它。有时,它不保存任何数据(用于步骤和描述);有时,它会为两行保存相同的数据。

我找不到任何文档来解释它是如何工作的。我调整了XSLTHTMLschema,但都无济于事。这让我很沮丧。

有没有人知道如何解决这个问题?

注意:这与我之前提出的另一个问题直接相关:Creating XSLT nodes dynamically/multiple XSLT nodes

提前感谢您的帮助。 . .

【问题讨论】:

    标签: xslt webforms xml-parsing xsd xml-serialization


    【解决方案1】:

    你需要为每个tr指定你想要的Plan元素,即第一个tr需要得到第一个Plan,以此类推。 为此,您可以在 [local-name()='Plan'] 谓词中使用 position() 函数,例如:

    [local-name()='Plan' and position()=1]
    

    对于第一个 tr

    [local-name()='Plan' and position()=2]    
    

    第二个tr,以此类推。

    这应该可以帮助您入门,但您也可以通过循环输出 tr 元素来使您的代码更智能。

    当您指定节点树(即节点集合)时,您问题中的示例 XPath 将返回 all Step 或 Description 元素。 position 函数允许您在节点树中选择单个节点。

    【讨论】:

    • 我会试一试,看看会发生什么。回复:循环输出 :这实际上正是我的想法。 maxOccurs 不是 10;它实际上是 100,我不打算写那么多元素。但是,我想确保在编写任何循环以输出元素之前,我可以先让它工作。
    【解决方案2】:

    这就是我最终得到这个工作的方法:

        <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,请注意“计划”之后的 [1] 和 [2]。当我将它们包含在 xpath 中时,它没有问题。

    【讨论】:

    • 你每天都学到一些东西,我没有意识到职位可以缩短为数字。
    • 是的,我在某个地方(不记得在哪里)遇到了一个使用该语法的示例。我试了一下,你瞧。 . .
    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多