xsl generate-id()函数为不同的节点返回两次相同的id

时间:2012-02-14 13:26:44

标签: 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="">
    <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>

当转换此输入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,仍然困扰着我,我不明白它的原因。

1 个答案:

答案 0 :(得分:0)

检查命名空间?如果ns0前缀绑定到错误的命名空间URI,则在两种情况下查询都会产生空结果集。与key的第一个参数一起,我想,这将对key()产生相同的调用,从而产生相同的ID。

此外,我认为key()功能不符合您的想法:http://www.w3schools.com/xsl/func_key.asp

在任何情况下,您都可以直接在要为其计算ID的节点集上应用generate-id()