XSLTForms/setnode
xf:setnode 操作是 XForms 的一個實驗性擴充套件,有助於使用 XSLT 轉換的輸出(見transform() 函式)或混合內容編輯器的輸出(見使用 TinyMCE 作為 XForms 控制元件 的討論)來更新例項文件。
此操作使用 xf:setnode 元素來指示。它有三個關鍵屬性
ref屬性是一個單節點繫結屬性,它指示目標節點。inner屬性指定應替換目標節點子節點的節點;其值為節點的序列化 XML 形式。outer屬性指定應替換目標節點的節點;其值為替換節點的序列化 XML 形式。
inner 和 outer 屬性是互斥的;必須指定其中一個,但不能同時指定兩者。正如在屬性值中表示序列化 XML 時通常的做法一樣,序列化形式中的左尖括號和與號必須進行轉義。
inner 或 outer 屬性的值將被解析為 XML,以生成 DOM 節點,並且生成的節點將替換目標節點的子節點或目標節點本身。
以下示例顯示了一個觸發器,它將名為 input 的例項替換為一個新文件。
<xf:trigger>
<xf:label>Generate diagram</xf:label>
<xf:action ev:event="DOMActivate">
<xf:setnode ref="instance('input')"
outer="<doc>
<title>My document</title>
<chapter>
<p>Hello, world!</p>
</chapter>
</doc>"/>
</xf:action>
</xf:trigger>
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 中,實現類似效果的一種方法是將字串(序列化 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 中實現類似效果,可以使用 xf:insert 操作,在 origin 屬性的值中使用 XForms 2.0 的 parse() 函式。
[需要示例。]