使用Infopath時要注意的有哪些

來源:互聯網
上載者:User

轉: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:編號")
這個並不能實現取出合格最後一個。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.