1

在 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 代码?

马汀

4

1 回答 1

0

我没有测试它,但我认为通过打破封装应该是可能的。如果没有这个,您的 XBL 将只能访问绑定节点的内容,就像在您的第三个代码片段中一样。如果要让 XBL 访问 XForms 实例数据,则必须在 XBL 中声明一个变量,该变量指向绑定节点的单节点绑定

以下是 Wiki 示例中的代码片段:

<xforms:group xbl:attr="model context ref bind" xxbl:scope="outer">
    <xforms:group xxbl:scope="inner">
        <!-- Variable pointing to external single-node binding -->
        <xxforms:variable name="binding" as="node()?">
            <xxforms:sequence select="." xxbl:scope="outer"/>
        </xxforms:variable>
        ...
    </xforms:group>
</xforms:group>

像这样定义了单节点绑定后,应该可以引用该变量并将其用于 xslt 转换。只需替换匹配根节点的 XSLT 模板元素并将其指向变量的内容$binding

<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="oc:instructionitem">
        <xforms:group ref="$binding">
          <x:div contentEditable="true">
              <xsl:apply-templates/>
          </x:div>
        </xforms:group>
    </xsl:template>

希望这对你有用。如果绑定节点(在您的示例中:)不为空,则可能需要进行规定oc:instructionitem,因此 xslt 可以同时处理该内容以及$binding变量的内容。

于 2011-08-02T08:44:43.177 回答