Function 函数的作用是:为不同的节点返回两次相同的id
我有一个用于转换的输入xml,如Function 函数的作用是:为不同的节点返回两次相同的id,function,xslt-1.0,Function,Xslt 1.0,我有一个用于转换的输入xml,如 <?xml version="1.0" encoding="UTF-8" ?> <AssetcustomerCollection xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/top/somens"> <Assetcustomer xmlns=""> .... </Assetcustomer> <Assetcustomer xmlns=""
<?xml version="1.0" encoding="UTF-8" ?>
<AssetcustomerCollection xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/top/somens">
<Assetcustomer xmlns="">
....
</Assetcustomer>
<Assetcustomer xmlns="">
<accountklantid>000000123456789</accountklantid>
<accountrowid>1-W8HQ1J</accountrowid>
<adrestypeaccnt/>
<adrestypecon/>
<assetbankcode>1173</assetbankcode>
<assetnumber>0000001234</assetnumber>
<assetprodcode>1200</assetprodcode>
<assetproduct>Overeenkomst Rekening-courant</assetproduct>
<assetproductlocatie>00</assetproductlocatie>
<assetstatus>Actief</assetstatus>
<assetsubstatus>Lopende rekening</assetsubstatus>
<assettypecode>0010</assettypecode>
<contactklantid/>
<contactrowid/>
<primairaccount>Y</primairaccount>
<primaircontact>N</primaircontact>
<reltypeaccnt>Hoofdcontractant</reltypeaccnt>
<reltypecon/>
<rowidasset>1-X3XBMO</rowidasset>
<rowidassetaccnt>1-X3XBMQ</rowidassetaccnt>
<rowidassetcon/>
<tnsidaccnt/>
<tnsidcon/>
</Assetcustomer>
<Assetcustomer xmlns="">
....
</Assetcustomer>
<Assetcustomer xmlns="">
<accountklantid/>
<accountrowid/>
<adrestypeaccnt/>
<adrestypecon/>
<assetbankcode>1173</assetbankcode>
<assetnumber>0000004321</assetnumber>
<assetprodcode>1201</assetprodcode>
<assetproduct>WereldPas (Zakelijk)</assetproduct>
<assetproductlocatie>00</assetproductlocatie>
<assetstatus>Actief</assetstatus>
<assetsubstatus>Lopende rekening</assetsubstatus>
<assettypecode>0003</assettypecode>
<contactklantid>000000987654321</contactklantid>
<contactrowid>1-X17PLM</contactrowid>
<primairaccount>N</primairaccount>
<primaircontact>Y</primaircontact>
<reltypeaccnt/>
<reltypecon>Pasverantwoordelijke</reltypecon>
<rowidasset>1-X3XBN0</rowidasset>
<rowidassetaccnt/>
<rowidassetcon>1-X3XBNE</rowidassetcon>
<tnsidaccnt/>
<tnsidcon/>
</Assetcustomer>
<Assetcustomer xmlns="">
....
</Assetcustomer>
</AssetcustomerCollection>
....
000000123456789
1-W8HQ1J
1173
0000001234
1200
奥弗伦科姆斯特·雷克宁·库兰特
00
艾瑟提夫
洛潘德雷克宁
0010
Y
N
蹄订约人
1-X3XBMO
1-X3XBMQ
....
1173
0000004321
1201
韦雷尔德帕斯(扎克利克)
00
艾瑟提夫
洛潘德雷克宁
0003
000000987654321
1-X17PLM
N
Y
帕斯韦兰特伍德利克酒店
1-X3XBN0
1-X3XBNE
....
当转换这个输入xml时,我得到了一个意外的输出(16个输入Assetcustomer节点中的15个被转换),我现在已经找到了原因,但无法解释它发生的原因
下面的转换两次返回相同的id
<xsl:element name="A">
<xsl:value-of select="generate-id(key('AssetRowIDs',/ns0:AssetcustomerCollection/Assetcustomer[rowidasset = '1-X3XBMO']/*)[1])"/>
</xsl:element>
<xsl:element name="B">
<xsl:value-of select="generate-id(key('AssetRowIDs',/ns0:AssetcustomerCollection/Assetcustomer[rowidasset = '1-X3XBN0']/*)[1])"/>
</xsl:element>
<A>N10211</A>
<B>N10211</B>
N10211
N10211
而为具有不同rowidasset的任何其他节点生成的id则不同
在我开始拔头发之前有什么想法吗
彼得
我不知道确切的原因,但正在改变
<xsl:key name="AssetRowIDs" match="Assetcustomer" use="rowidasset"/>
进入
及
进入
似乎为每个节点生成了一个唯一的id,但我仍然不明白它的原因 检查名称空间?如果
ns0
前缀绑定到错误的命名空间URI,则在这两种情况下,您的查询都将生成一个空结果集。加上key的相同第一个参数,我想,这将产生对key()
的相同调用,从而产生相同的ID
另外,我认为key()
函数的作用与您认为的不同:
在任何情况下,您都可以直接在要计算id的节点集上应用
generate-id()
。Hi,我想我确实理解generate-id()和key()。xsl:key在模板()之前定义。在原始xsl中,我使用键get-a-unique-list-of-assetrowids()。我不止一次这样做,并取得了预期的效果。同样在这个转换中,除了在这个输入xml中有2个节点之外。
<xsl:key name="AssetRowIDs" match="Assetcustomer" use="concat('-',rowidasset,'-')"/>
<xsl:for-each select="/ns0:AssetcustomerCollection/Assetcustomer[generate-id() = generate-id(key('AssetRowIDs',rowidasset)[1])]">
<xsl:for-each select="/ns0:AssetcustomerCollection/Assetcustomer[generate-id() = generate-id(key('AssetRowIDs',concat('-',rowidasset,'-'))[1])]">