跳轉到內容

XSLTForms/setnode

來自華夏公益教科書,自由的教科書

xf:setnode 操作是 XForms 的一個實驗性擴充套件,有助於使用 XSLT 轉換的輸出(見transform() 函式)或混合內容編輯器的輸出(見使用 TinyMCE 作為 XForms 控制元件 的討論)來更新例項文件。

此操作使用 xf:setnode 元素來指示。它有三個關鍵屬性

  • ref 屬性是一個單節點繫結屬性,它指示目標節點。
  • inner 屬性指定應替換目標節點子節點的節點;其值為節點的序列化 XML 形式。
  • outer 屬性指定應替換目標節點的節點;其值為替換節點的序列化 XML 形式。

innerouter 屬性是互斥的;必須指定其中一個,但不能同時指定兩者。正如在屬性值中表示序列化 XML 時通常的做法一樣,序列化形式中的左尖括號和與號必須進行轉義。

innerouter 屬性的值將被解析為 XML,以生成 DOM 節點,並且生成的節點將替換目標節點的子節點或目標節點本身。

以下示例顯示了一個觸發器,它將名為 input 的例項替換為一個新文件。

  <xf:trigger>
    <xf:label>Generate diagram</xf:label>
    <xf:action ev:event="DOMActivate">
      <xf:setnode ref="instance('input')" 
                  outer="&lt;doc&gt;
  &lt;title&gt;My document&lt;/title&gt;
  &lt;chapter&gt;
      &lt;p&gt;Hello, world!&lt;/p&gt;
  &lt;/chapter&gt;
&lt;/doc&gt;"/>
    </xf:action>
  </xf:trigger>

使用 setnodetransform()

[編輯 | 編輯原始碼]

setnode 的一個更常見的用法可能是使用 XSLT 樣式表或混合內容編輯器來更新例項,它們都返回包含其結果的序列化 XML 形式的字串。

假設我們有一個輸入例項,使用者可以透過表單修改它,以及一個 XSLT 樣式表 (make-svg.xsl),它可以處理輸入例項並建立一個表示例項中某些資訊的 SVG 圖表。為了允許使用者生成一個新的圖表,我們可以提供一個觸發器,指定如下

  <xf:trigger>
    <xf:label>Generate diagram</xf:label>
    <xf:action ev:event="DOMActivate">
      <xf:setnode ref="instance('svg')" 
                   outer="transform(instance('input'),'make-svg.xsl')"/>
      <xf:toggle case="picture"/>
    </xf:action>
  </xf:trigger>

這假設我們有一個名為 svg 的例項,轉換的輸出應放在那裡。它還假設在某處有一個開關語句,其中包含一個名為 picture 的情況,它顯示生成的 SVG。

在標準 XForms 1.1 中實現類似效果

[編輯 | 編輯原始碼]

在標準 XForms 1.1 中,實現類似效果的一種方法是將字串(序列化 XML)提交到一個伺服器,該伺服器以 application/xml(或類似的)MIME 型別將其反射回來,並指定提交更新所討論的例項。

上面給出的示例將被改寫為

  <xf:trigger>
    <xf:label>Generate diagram</xf:label>
    <xf:action ev:event="DOMActivate">
      <xf:setvalue ref="instance('svg')" 
                   value="transform(instance('input'),'make-svg.xsl')"/>
      <xf:send submission="parse-as-xml"/>
      <xf:toggle case="picture"/>
    </xf:action>
  </xf:trigger>

parse-as-xml 提交將 svg 例項的字串值提交到伺服器,伺服器將其反射回 XML(因此瀏覽器將其解析並按常規更新例項)

  <xf:submission id="parse-as-xml"
                 ref="instance('svg')/text()"
                 method="post"
                 resource="../lib/reflect-as-xml.sh"
                 replace="instance"
                 instance="svg"
                 />

伺服器上的 CGI 指令碼除了返回提交的資料以外什麼也不做,並將資料標記為 XML

#!/bin/sh
echo "Content-Type: application/xml"
echo
cat

在標準 XForms 2.0 中實現類似效果

[編輯 | 編輯原始碼]

為了在 XForms 2.0 中實現類似效果,可以使用 xf:insert 操作,在 origin 屬性的值中使用 XForms 2.0 的 parse() 函式。

[需要示例。]

華夏公益教科書