Saxon-CE_1.1 set-attribute一旦手动更改了值,就不会更新输入元素的属性

时间:2016-11-29 08:00:22

标签: xslt saxon

我对XSLT和使用Saxon CE处理器都很陌生。我正在编写一个转换,其中一个提交按钮的onclick事件会写入'已检查'文本字段的复选框的状态。只要不手动编辑文本,它就可以正常工作。手动编辑文本后,任何后续的onclick事件都无法将复选框状态写入文本字段。

我不确定我做错了什么。下面是xsl文件的代码片段。非常感谢任何有关解决这个谜语的帮助或建议,我花了一天时间思考。

<xsl:template match="/">
    <input type="checkbox" name="chk1" value="chk1"/>
    <input type="submit" value="Show Selection" name="btnShowText"/>
    <input name="txtResult"/>
</xsl:template>

<xsl:template match="//input[@name='btnShowText']" mode="ixsl:onclick">
    <xsl:apply-templates select="//input[@name='txtResult']"/>
</xsl:template>

<xsl:template match="//input[@name='txtResult']">
    <ixsl:set-attribute name="value" select="//input[@name='chk1']/@prop:checked"/>
</xsl:template>

3 个答案:

答案 0 :(得分:0)

使用Javascript和Saxon,要操作表单控件,您需要设置控件的属性,而不是属性,因此请使用ixsl:set‑property

<xsl:template match="//input[@name='txtResult']">
    <ixsl:set-property object="." name="value" select="//input[@name='chk1']/@prop:checked"/>
</xsl:template>

答案 1 :(得分:0)

首先,请注意Saxon-CE正在被Saxon-JS取代。

其次,ixsl:set-attribute具有延迟效果 - 仅在当前转换阶段(即onclick事件的处理)结束时才进行更新。

但话说回来,我不确定这是否已经触底。我经常发现在这个领域令人困惑的一件事是HTML DOM中的属性(例如值)与底层属性(例如checked属性)之间的区别,它们并不总是同步的。

调试是否表明实际执行了onclick模板?

答案 2 :(得分:0)

使用Saxon-JS,以下似乎可行(在将名称属性更改为HTML中的id属性之后):

<xsl:template match="*[@id='btnShowText']" mode="ixsl:onclick">
  <ixsl:set-property name="value" object="id('txtResult',ixsl:page())"
    select="ixsl:get(id('chk1',ixsl:page()), 'checked')"/>
</xsl:template>

我没有得到任何其他变体,特别是//input[@id='txtResult']的apply-templates未被评估/不匹配。我怀疑这是由于我的命名空间HTML源代码,但*:input也不匹配。