在 Orbeon Forms 中,我需要创建一个组件(使用 XBL),当绑定到类似的实例时
<OCinstructionitem>
<OCp>paragraph 1</OCp>
<OCp>paragraph 2 <OCem>with italics part</OCem> rest of paragraph 2 </OCp>
</OCinstructionitem>
像这样创建一个可编辑的 div:
<div contentEditable="true">
<p>paragraph 1</p>
<p>paragraph 2 <i>with italics part</i> rest of paragraph 2 </p>
</div>
我的想法是我需要使用 XSLT 来做到这一点。当要转换的 XML 在 xforms 文档中时,我得到了这个工作:
<oc:instructionitem>
<OCinstructionitem>
<!-- here the xml of above -->
...
</OCinstructionitem>
</oc:instructionitem>
但我想让 XSLT 在绑定节点上运行,如下所示:
<oc:instructionitem ref="OCinstructionitem"/>
但是,我无法从 XSLT 访问绑定节点。
我的问题:这是不可能的吗?还是我必须修改我的 XBL?
我的 XBL 代码:
<xbl:binding id="oc-instructionitem" element="oc|instructionitem">
<xbl:template xxbl:transform="oxf:xslt">
<xsl:transform version="2.0">
<xsl:template match="@*|node()" priority="-100">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="text()" priority="-100" mode="in-paragraph">
<xsl:copy>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
<xsl:template match="OCem" mode="in-paragraph">
<x:i><xsl:value-of select="."/></x:i>
</xsl:template>
<xsl:template match="OCp">
<x:div>
<xsl:apply-templates mode="in-paragraph"/>
</x:div>
</xsl:template>
<xsl:template match="/*">
<x:div contentEditable="true">
<xsl:apply-templates/>
</x:div>
</xsl:template>
</xsl:transform>
</xbl:template>
</xbl:binding>
</xbl:xbl>
任何帮助将不胜感激,
编辑:在对 tohuwawohu (下)的有用评论之后,您似乎需要定义一个绑定到实例数据的变量。像这样:
<xsl:template match="oc:instructionitem">
<xforms:group xbl:attr="model context ref bind" xxbl:scope="outer">
<xxforms:variable name="binding" as="node()?" xxbl:scope="inner" >
<xxforms:sequence select="." xxbl:scope="outer"/>
</xxforms:variable>
<xforms:group xxbl:scope="inner">
<!-- Variable pointing to external single-node binding -->
<xforms:group ref="$binding">
<xsl:call-template name="main"/>
</xforms:group>
</xforms:group>
</xforms:group>
</xsl:template>
<xsl:template name="main">
<x:div contentEditable="true">
<xforms:repeat nodeset="*">
<xsl:call-template name="paragraph"/>
</xforms:repeat>
</x:div>
</xsl:template>
但是,XSLT 元素仍然不能作用于数据。它只能生成 XFORMS 元素,这些元素可以作用于数据。这意味着永远不会选择像 <xsl:template match="OCp"> 这样的东西。这就是上面代码使用命名模板的原因。所以问题仍然存在:绑定的数据是否可用于 xslt 代码?
马汀