2012-02-14 18 views
0

次のような変換の入力XMLがあります。xsl generate-id()関数は、異なるノードに対して同じidを2回返します。

<?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を変換する(ノードAssetcustomer 16入力の15を形質転換した)私は今原因を発見したが、それが発生した理由を説明することはできません。

次の変換は同じidを2回返します。

<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を生成しているように見えますが、原因はわかりません。

答えて

0

名前空間を確認しますか? ns0という接頭辞が間違った名前空間URIにバインドされている場合、どちらの場合もクエリは空の結果セットを生成します。同じ最初のkeyの引数と一緒に、key()と同じIDを返して同じIDを返します。あなたがIDを計算したいのノードセット上で直接generate-id()を適用することができますどのような場合にはhttp://www.w3schools.com/xsl/func_key.asp

を:

また、私はkey()機能は、あなたがそれがない何を考えていないと思います。

+0

こんにちは、私はgenerate-id()とkey()を理解していると思います。 xsl:キーは、テンプレートの前に定義されています()。元のxslではキーを使用して、assetrowids()。私はこれを期待された結果で2回以上行った。また、この変換では、この入力xmlの2つのノードを除きます。 – pcvnes

関連する問題