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_LegAccU_LegAccResultSetRow

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

または、Row要素が 1 か所でしか発生しない場合は、これだけかもしれません

<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

row入力内の同じ要素から要素を発行している XSL の部分:

<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 に答える