引用属性中保存的数据时,XSLTForms 计算不起作用

Posted

技术标签:

【中文标题】引用属性中保存的数据时,XSLTForms 计算不起作用【英文标题】:XSLTForms calculation not working when referencing data held in attributes 【发布时间】:2021-04-20 00:33:50 【问题描述】:

抱歉,如果以下问题措辞不当,我对 XML 中所有正确术语的经验有限。

所以我最近一直在使用 XSLTForms 作为一种快速生成测试数据的 xml 表示形式以进入我的工作场所 LIMS 系统的方法。但是,由于 xml 必须形成的方式,我似乎遇到了 XSLTForms 或我正在使用的 XPath 语法的障碍。

简化我的 xml 格式以制作一个小的工作示例 xhtml 文件如下:

<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
    <title>Example Test</title>
    <xf:model>
        <xf:instance>
            <root xmlns="">
                <child name="one" value=""></child>
                <child name="two" value=""></child>
                <child name="three" value=""></child>
            </root>
        </xf:instance>
        <xf:bind id="ChildOne" ref="child[@name='one']" type="xs:decimal" />
        <xf:bind id="ChildTwo" ref="child[@name='two']" type="xs:decimal" />
        <xf:bind id="ChildThree" ref="child[@name='three']" calculate="../child[@name='one'] - ../child[@name='two']"
            type="xs:decimal" />
    </xf:model>
</head>
<body>
    <xf:input bind="ChildOne">
        <xf:label>Node One:</xf:label>
    </xf:input>
    <xf:input bind="ChildTwo">
        <xf:label>Node Two:</xf:label>
    </xf:input>
    <xf:output ref="child[@name='three']">
        <xf:label>Node Three Calculation:</xf:label>
    </xf:output>
</body>
</html>

这可以正常工作,输入存储在相关节点中,最终绑定标记中的计算属性计算出 ChildOne 和 ChildTwo 的差异,存储在 ChildThree 中。最后,输出标签显示 ChildThree 节点的值。

当 Xpath 表达式中的值存储在打开和关闭子节点之间时,bind 中的计算属性可以正常工作,例如:

<child name="ChildOne" value="">10</child>

但正如我在开始时提到的,xhtml 代码是一个工作示例,当我开始调整代码以匹配 LIMS 系统的 XML 结构时,事情就中断了。

如果我将绑定更改为使用 @value 引用子节点的 value 属性:

    <xf:bind id="ChildOne" ref="child[@name='one']/@value" type="xs:decimal" />
    <xf:bind id="ChildTwo" ref="child[@name='two']/@value" type="xs:decimal" />
    <xf:bind id="ChildThree" ref="child[@name='three']/@value" calculate="../child[@name='one']/@value - ../child[@name='two']/@value"
        type="xs:decimal" />

同时更新输出 ref 属性如下:

<xf:output ref="child[@name='three']/@value">
    <xf:label>Node Three Calculation:</xf:label>
</xf:output>

对 value 属性的赋值似乎适用于绑定到输入标签的 ChildOne 和 ChildTwo。这已从我的工作代码 xml 输出中得到证实,但计算无法正常工作,因为 value 属性中仅存储了零。

我在计算属性 XPath 表达式中是否遗漏了什么?

calculate="../child[@name='one']/@value - ../child[@name='two']/@value"

任何帮助将不胜感激,在此先感谢您。

【问题讨论】:

【参考方案1】:

在 bind/@ref 中添加“/@value”时,计算 MIP 必须相应修改:calculate="../../child[@name='one']/@value - ../../child[@name='two']/@value

【讨论】:

谢谢 Alain,它有效,在我的实际代码中,我使用了两组双点,但它不起作用,这就是为什么我没有在示例中尝试它的原因。事实证明,我的实际代码中需要四组双点。非常感谢。

以上是关于引用属性中保存的数据时,XSLTForms 计算不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Exist-db 和 XSLTforms 将节点集插入文档

未在任何地方引用的 Vue 计算属性

如何使用 eXist-db 和 xsltForms 通过浏览器编辑 xml 文件

将 Jquery UI 添加到 XSLTForms

Swift get和set方法以及只读属性(计算型属性,本身不保存数据,都是通过计算获得结果)

jquery数据属性不解析json字符串