2012-02-14 161 views
0

我有一个用于转换的输入xml;xsl generate-id()函数为不同节点返回相同的id两次

<?xml version="1.0" encoding="UTF-8" ?> 
<AssetcustomerCollection xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/top/somens"> 
    <Assetcustomer xmlns=""> 
    .... 
    </Assetcustomer> 
    <Assetcustomer xmlns=""> 
    <accountklantid>00000</accountklantid> 
    <accountrowid>1-W8HQ1J</accountrowid> 
    <adrestypeaccnt/> 
    <adrestypecon/> 
    <assetbankcode>1173</assetbankcode> 
    <assetnumber>00000</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> 

在变换此输入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> 

虽然具有不同rowidasset的任何其他节点的生成ID是不同的。

在我开始拔头发之前有什么想法吗?

彼得

我不知道为什么,但改变

<xsl:key name="AssetRowIDs" match="Assetcustomer" use="rowidasset"/> 

<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])]"> 

似乎为每个节点生成一个唯一的ID,但仍然令我感到不舒服dat我不明白它的原因。

回答

0

检查命名空间?如果ns0前缀绑定到错误的名称空间URI,则在两种情况下,您的查询都会产生空的结果集。再加上相同的第一个参数,我想,这将产生相同的电话key(),因此相同的ID。

此外,我不认为key()的功能是什么,你认为它的作用:http://www.w3schools.com/xsl/func_key.asp

在任何情况下,你可以直接申请generate-id()上要为其计算ID的节点集。

+0

嗨,我想我明白generate-id()和key()。 xsl:key在模板()之前定义。在原始的xsl中,我使用键获取一个唯一的assertowids列表()。我已经做了不止一次的预期结果。同样在这个转换中,除了在这个输入xml中有2个节点。 – pcvnes 2012-02-14 13:41:59

相关问题