2013-04-14 113 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>