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

posted on 2007-06-07 15:59  Dragon-China  阅读(789)  评论(0编辑  收藏  举报