轉:http://www.cnblogs.com/dujun0618/articles/750088.html
在用appendChild時注意
1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var fatherNode = XDocument.DOM.selectSingleNode("/tr:青少年活動中心/ns1:統計報表[my:表單編號='" + tid + "']/my:記錄組");
var sonNode = XDocument.DOM.selectSingleNode("/tr:青少年活動中心/ns1:統計報表[my:表單編號='" + tid + "']/my:記錄組/my:組");
var sonNodeList = XDocument.DOM.selectNodes("/tr:青少年活動中心/ns1:統計報表[my:表單編號='" + tid + "']/my:記錄組/my:組");
2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sonNodeList.removeAll();
3^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var cloneNodeList=sonNode.cloneNode(true);
cloneNodeList.selectSingleNode("my:日期").text=t3;
//取得各種單據的申請時間資訊
cloneNodeList.selectSingleNode("my:公出申請單").text = getTimeValue("公出申請單",ygname,t3);
cloneNodeList.selectSingleNode("my:加班審批單").text = getTimeValue("加班審批單",ygname,t3);
cloneNodeList.selectSingleNode("my:事病假單").text = getTimeValue("事病假單",ygname,t3);
cloneNodeList.selectSingleNode("my:調休申請單").text = getTimeValue("調休申請單",ygname,t3);
cloneNodeList.selectSingleNode("my:年休假申請單").text = getTimeValue("年休假申請單",ygname,t3);
fatherNode.appendChild(cloneNodeList);
要用這個方法,進行自動增加子結點。一定要注意,"my:記錄組"的子結點裡只有"my:組",不能有其它結點或組。如果一定要有,那麼在appendChild時,也一定要將"my:記錄組"的子結點補全才行。
my:記錄組/my:組
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
var parentnode = XDocument.DOM.selectSingleNode("/my:青少年活動中心/my:老師組/my:老師/my:時間組");
var sonnode = XDocument.DOM.selectSingleNode("/my:青少年活動中心/my:老師組/my:老師/my:時間組/my:時間");
parentnode.appendChild(sonnode.cloneNode(true));//正確的
parentnode.appendChild(sonnode);//錯誤的,因為sonnode已經是指標指定好了,所以總是加本身。
cloneNode(true)的作用是複製sonnode結點的副本,並且子結點也複製。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
用appendChild的前提是添加結點的父結點是重複結點。
用count()函數注意
count(/my:溫州聖火/my:模板結構/my:電梯型別參數[my:生產編號 = /my:溫州聖火/my:生產編號用於產生序號]/my:組件組[my:組件類型 = /my:溫州聖火/my:組件類型用於產生序號]/my:標準組件/my:組/my:組件資訊組/my:編號)
count()函數裡只能是正規的xpath語句,並且還不能飲食雙引號。不能用concat()函數組合成的xpath語句。
[my:組件類型 = /my:溫州聖火/my:組件類型用於產生序號]過濾裡能用絕對路徑就盡量用。
無法開啟infopath表單的原因
XDocument.GetDOM("員工資訊錄入表").selectNodes(ns1:姓名); 這樣會打不開表單,我當時也不相信,指令碼還沒引發但是運行表單時會檢查的。
改成
XDocument.GetDOM("員工資訊錄入表").selectNodes(/dfs:myFields/dfs:dataFields/tns:GetDataResponse/tns:GetDataResult/tr:員工基本資料/ns1:姓名);就沒錯了。
總之表單開啟時會檢查指令碼的文法。
有時命名空間太長,分號不能在第二行,不然也打不開。
使用View.ExecuteAction命令時重複表格結構問題
my:生產表/my:生產(表內容)
一般添加重複表格時預設結構是my:group1/my:group2,my:group2是重複表格名可重複,而my:group1是它的父結點非重複的。
我在使用XDocument.View.ExecuteAction("xCollection::insert","生產_9"),提示錯誤,當時以為是XmlToEdit名稱不能用中文名,然後換成字母后也出錯。
原來在添加重複表格時,把重複表格的父結點刪掉,換成重複節的結點。而重複節是可重複的。所以就出錯了。
規則不能自調用
在本欄位裡設規則時,不能對本規則進行值的改變。這樣會進入死迴圈的,不過系統是不會死迴圈的,它會在幾次調用後自動跳出。
"在該表單的代碼中出現錯誤。為單次資料更新調用 OnAfterChange 事件的次數已超過允許的最大值。"
xsl樣式轉換出來的欄位裡規則不能響應
xsl樣式轉換出來的欄位裡規則不能響應,而在重複表格的新增刪規則是可以用的。
XSLT中注意命名空間
//xslt樣式
//---------------------------------------------------------------------------------------------
xslContent = '<?xml version="1.0" encoding="gb2312" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-23T07:44:28">'
xslContent +='<xsl:template match="/"><my:工資組><xsl:for-each select="my:統計組/my:老師組/my:老師">'
xslContent +='<my:人名組><my:教師姓名><xsl:value-of select="my:姓名"/></my:教師姓名>'
xslContent +='<my:課時數></my:課時數>'
xslContent +='<my:課時標準></my:課時標準>'
xslContent +='<my:金額></my:金額>'
xslContent +='<my:補發金額></my:補發金額>'
xslContent +='<my:總金額></my:總金額>'
xslContent +='<my:納稅金額></my:納稅金額>'
xslContent +='<my:稅後金額></my:稅後金額>'
xslContent +='<my:備忘1></my:備忘1></my:人名組></xsl:for-each>'
xslContent +='</my:工資組></xsl:template></xsl:stylesheet>'
//-------------------------------------------------------------------------------------------------
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-23T07:44:28" 這個命名空間的申明不能省去,因為裡面有my:首碼。不然不會成形。
var xslDom = XDocument.CreateDOM();
xslDom.loadXML(xslContent);
XDocument.UI.Alert(xslContent);
XDocument.UI.Alert(xslDom.xml);
Xpath中空白字元是有效
[my:所屬組件=' 原料']
[my:所屬組件='原料']
這兩個是有區別的。
Xpath路徑(區分大小寫)
var ylid = XDocument.DOM.selectSingleNode('my:myFields/my:原材料資訊/my:編號').text;
單引號和雙引號都行
裡面一定要區分大小寫
my:myFields F是大寫
XDocument.CreateDOM()對象命名空間的申明方法
transDOM = XDocument.CreateDOM();
transDOM.loadXML(xmlDOM.transformNode(xslDOM));
-----------------------------------------
transDOM.setProperty("SelectionNamespaces", 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-23T07:44:28" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003"');
-------------------------------------------
和主要資料源的命名空間一樣申明
XDocument.DOM.setProperty("SelectionNamespaces", 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-23T07:44:28" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003"');
XDocument.CreateDOM()對象和結點對象
function CTRL8_5::OnClick(eventObj)
{
var strUrl = "http://localhost/testform3.xml";
var oXmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
oXmlHttp.Open("GET", strUrl, false);
oXmlHttp.Send();
XDocument.UI.Alert(oXmlHttp.responseXML.xml);
XDocument.UI.Alert(oXmlHttp.responseXML.selectSingleNode("/my:myFields/my:mybooks").xml);
var rexml = oXmlHttp.responseXML.selectSingleNode("/my:myFields/my:mybooks");
var renode = XDocument.CreateDOM();
renode.loadXML(rexml.xml);
XDocument.UI.Alert(renode.xml);
var node = XDocument.DOM.selectSingleNode("/my:myFields/my:mybooks");
node.parentNode.appendChild(renode.documentElement);
oXmlHttp.Open("PUT", strUrl, false);
oXmlHttp.Send(XDocument.DOM.xml);
}
renode對象載入了XML後,它不selectSingleNode對象不一樣,還要renode.documentElement這樣得到根結點。然後才和selectSingleNode對象一樣使用。
transformNode中XML被轉換結點和XSL中查詢路徑
如果單純是XML檔案那麼<>內的結點名不一定要my:等首碼,有也沒事,那就全當成名文書處理,這樣在XSL語句中選擇路徑時就要結點全名了。
首碼只是在infopath中用於表示結點結構。是一種構架規則。
last()用在不同地方有區別
/my:溫州聖火/my:模板結構/my:備忘[last()]
用作下拉時會取出每張表的備忘的最後結,而備忘只有一個結,所有相當於取出所有的備忘了。
/my:溫州聖火/my:模板結構[last()]/my:備忘
用作下拉時會取出最後一張表的備忘。
======================================================================
concat("/my:溫州聖火[my:模板結構/my:所屬組件='", ., "']/my:模板結構[last()]/my:編號")
這樣是先找到符合條件結點,然後取出最後一個。
concat("/my:溫州聖火/my:模板結構[my:所屬組件='", ., "' and last()]/my:編號")
這個並不能實現取出合格最後一個。