Function 函数的作用是:为不同的节点返回两次相同的id

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,如

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