2013-04-14 112 views
0

如果我有XML,看起來像這樣XSLT匹配值

<Msg> 
    <Payload role="s"> 
     <row> 
     <venue>XDM</venue> 
     <account>60190</account> 
     </row> 
    </Payload> 
    <Payload role="c" id="atom1"> 
     <ResultSet> 
     <Row> 
      <U_LegAcc>XDM60190</U_LegAcc> 
      <U_AccCod>SYS00000000508</U_AccCod> 
     </Row> 
     </ResultSet> 
    </Payload> 
</Msg> 

我需要在此基礎上匹配到會場的級聯值(XDM)的U_LegAcc的U_AccCod節點值&帳戶(61090),即XDM61090

我怎樣才能得到XML,看起來像這樣。

<Msg> 
    <Payload> 
    <row> 
    <venue>XDM</venue> 
    <account>60190</account> 
    <U_AccCod>SYS00000000508</U_AccCod> 
    </row> 
</Payload> 
</Msg> 

我試圖簡化它,去除級聯只是爲了獲得一個開始,但我甚至不能得到那個工作,即<account><U_AccCod>是相同的。我一直在使用的關鍵嘗試,但我沒有得到任何輸出

<xsl:key name="sapaccount" match="ResultSet" use="U_LegAcc" /> 

<xsl:template match="Row" mode="name"> 
    <xsl:value-of select="U_AccCod" /> 
</xsl:template> 

<xsl:template match="row/account"> 
    <xsl:apply-templates select="key('sapaccount', .)" mode="name" /> 
</xsl:template> 

回答

0

在您的XSL是從同一個元素髮射row元素在輸入部分:

<xsl:template match="row"> 
    <row> 
     <xsl:copy-of select="venue"/> 
     <xsl:copy-of select="account"/> 
     <U_AccCod> 
      <xsl:variable name="this" select="."/> 
      <xsl:value-of select="/Msg/Payload/ResultSet/Row/U_AccCod[../U_LegAcc=concat($this/venue,$this/account)]"/> 
     </U_AccCod> 
    </row> 
</xsl:template> 

未經檢驗的,可需要調整。

+0

謝謝你....有一些名稱空間的問題,但最終得到它的工作與Y我們的幫助。 – canbexta

1

其實沒有理由爲什麼你不能繼續在這裏使用的關鍵。它們通常用於查找元素的效率更高。您當前的關鍵問題是,是不太正確的。目前您正在尋找ResultSet元素由U_LegAcc價值的手段,但U_LegAcc不是ResultSet直接孩子,但,所以你可能要定義你的鑰匙像這樣:

<xsl:key name="sapaccount" match="ResultSet/Row" use="U_LegAcc" /> 

或者,也許只是這個如果元素只能在一個地方出現

<xsl:key name="sapaccount" match="Row" use="U_LegAcc" /> 

然後,查找的值,如果定位在account元素,你可以這樣做:

<xsl:apply-templates select="key('sapaccount', concat(preceding-sibling::venue, .))" /> 

或者更好的是,有一個模板到row元素匹配,然後你就可以做到這一點

<xsl:apply-templates select="key('sapaccount', concat(venue, account))" /> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="sapaccount" match="Row" use="U_LegAcc"/> 

    <xsl:template match="Payload[@role='s']"> 
     <Payload> 
     <xsl:apply-templates/> 
     </Payload> 
    </xsl:template> 

    <xsl:template match="Payload[@role='c']"/> 

    <xsl:template match="row"> 
     <row> 
     <xsl:apply-templates/> 
     <xsl:apply-templates select="key('sapaccount', concat(venue, account))/U_AccCod"/> 
     </row> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的XML,以下是輸出

<Msg> 
    <Payload> 
     <row> 
     <venue>XDM</venue> 
     <account>60190</account> 
     <U_AccCod>SYS00000000508</U_AccCod> 
     </row> 
    </Payload> 
</Msg>