我对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>
答案 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
也不匹配。