0

如果我有看起来像这样的 xml

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

我需要根据 U_LegAcc 获取 U_AccCod 节点值,该值与场地 (XDM) 和帐户 (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>
4

2 回答 2

1

实际上没有理由不能在这里继续使用密钥。它们通常更有效地用于查找元素。您当前密钥的问题在于这不太正确。您当前正在ResultSet通过U_LegAcc值查找元素,但U_LegAcc不是 的直接子级ResultSet,而是 的Row,因此您可能希望像这样定义您的键:

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

或者也许只是这样,如果Row元素只能出现在一个地方

<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>
于 2013-04-14T14:31:23.023 回答
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>

未经测试,可能需要调整。

于 2013-04-14T06:54:56.417 回答