1

我正在使用 Saxon-CE 和 Xslt 2.0 在网页(组合框)上进行控件。我在将多个控件的值传递给使用该控件中的值来处理文档的模板时遇到了麻烦。这是我所拥有的:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT"
extension-element-prefixes="ixsl">

<xsl:template match="/">

<xsl:result-document href="#comboBox1">
  <select id="myBox1">
    <option value="1">One</option>
    <option value="2">two</option>
  </select>
</xsl:result-document>

<xsl:result-document href="#comboBox2">
  <select id="myBox2">
    <option value="A">Letter-A</option>
    <option value="B">Letter-B</option>
  </select>
</xsl:result-document>

</xsl:template>

<xsl:template match="select[@id='myBox1'] mode=ixsl:onchange">
 <xsl:variable name="control1" select="."/>
 <xsl:variable name="numVal" select="ixsl:get($control1,'value')"/>

 <xsl:call-template name="displayStuff">
   <xsl:with-param name="field1" select="$numVal"/>
 </xsl:call-template>
</xsl:template>

<xsl:template match="select[@id='myBox2'] mode=ixsl:onchange">
 <xsl:variable name="control2" select="."/>
 <xsl:variable name="letVal" select="ixsl:get($control2,'value')"/>

 <xsl:call-template name="displayStuff">
   <xsl:with-param name="field2" select="$letVal"/>
 </xsl:call-template>

</xsl:template>

<xsl:template name="displayStuff">
 <xsl:param name="field1" select="0"/>
 <xsl:param name="field2" select="Z">
  <xsl:result-document href="#display" method="ixsl:replace-content">
    <xsl:text>Number: </xsl:text> <xsl:value-of select="$field1"/><br/>
    <xsl:text>Letter: </xsl:text> <xsl:value-of select="$field2"/><br/>        
  </xsl:result-document>
</xsl:template>

</xsl:stylesheet>

问题是每个控件都将正确的值返回给刚刚更改的 then 项的显示模板,而不是其他项。

例如,如果我在第一个 Dropbox 中选择 1,我会得到 Number: 1 Letter: Z

但是现在如果我更改第二个保管箱的值(例如对 A 说),我会得到 Number: 0 Letter:A。

如何确保传递给显示模板的是所有 Dropbox 的当前选定值,而不是刚刚更改的值?

4

1 回答 1

1

与其将控件的当前值作为参数传递给 displayStuff 模板,为什么不让该模板通过 XPath 表达式直接从 HTML 页面访问它们呢?

我怀疑您可以将所有这些组合到一个模板中:

<xsl:template match="select[@id=('myBox1', 'myBox2')] mode=ixsl:onchange">
 <xsl:variable name="control1" select="."/>
 <xsl:variable name="numVal" select="ixsl:get(id('myBox1'),'value')"/>
 <xsl:variable name="letVal" select="ixsl:get(id('myBox2'),'value')"/>
  <xsl:result-document href="#display" method="ixsl:replace-content">
    <xsl:text>Number: </xsl:text> <xsl:value-of select="$numVal"/><br/>
    <xsl:text>Letter: </xsl:text> <xsl:value-of select="$letVal"/><br/>        
  </xsl:result-document>
</xsl:template>
于 2013-01-21T12:20:30.233 回答