在用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:编号")
这个并不能实现取出符合条件的最后一个。