1

特定の要素にのみ変換ルールを適用し、残りはそのままコピーする XML を変換する必要があります。以下は、ソースと予想される xml ブロッ​​クです。

<Object class="Item" version="1.0" distName="A-1/B-1/Item-0">
     <p name="sDate">2013-02-11T00:00:00+02:00:00</p>
     <p name="present">1</p>
     <p name="stopD">2013-02-21T00:00:00+02:00:00</p>
     <p name="id">CPU</p>
</Object>
<Object class="Period" version="1.0" distName="A-1/B-1/Item-0/Period-0">
     <p name="sHour">0</p>
     <p name="sMinute">0</p>
     <p name="interval">1</p>
     <p name="day">0</p>
</Object>

<Object class="Items" distName="A-1/B-1/Items-0">
<p name="IsPresent">1</p>
<p name="StartDate">08-11-2012</p>
<p name="StopDate">29-11-2012</p>
<list name="TimePeriod">
    <item>
        <p name="id">1</p>
        <p name="StartTime">00:00</p>
        <p name="day">0</p>
        <p name="interval">15</p>
    </item>
</list>
<list name="TypeRef">
    <p>Diameter</p>
</list>

1. Object 要素の上に、親子階層を持つ distName に基づいて別の Object 要素を結合する必要があります。例 : A-1/B-1/Item-0A-1/B-1/Item-0/Period-0

  1. 以下のようにマッピングします。
    • sDate から StartDate
    • 現在から IsPresent
    • stopD から StopDate
    • id から TypeRef リストへ
    • 他のソース ノードは、期間リストにマップする必要があります。

誰でもこれで私を助けることができますか??

4

1 に答える 1

1

期待される結果のアイテムの一部は入力と一致しないようですが、これはポイント A からポイント B に移動するのに役立つかもしれません。ここで日付変換を行っていないため、ソースの TypeRef が何であるかわかりません。

      <xsl:template match="Object[@class='Item']">
            <xsl:variable name="mainobj" select="."/>
            <xsl:variable name="distName" select="@distName"/>
            <Object class="Items" distName="{$distName}">
                <p name="IsPresent">
                    <xsl:value-of select="p[@name='present']"/>
                </p>
                <p name="StartDate">
                    <xsl:value-of select="p[@name='sDate']"/>
                </p>
                <p name="StopDate">
                    <xsl:value-of select="p[@name='stopD']"/>
                </p>
                <xsl:variable name="objperiod" select="//Object[starts-with(@distName,$distName)][not(.=$mainobj)]"/>
                <xsl:for-each select="$objperiod">
                <list name="TimePeriod">
                    <item>
                        <p name="id">
                            <xsl:value-of select="p[@name='id']"/>
                        </p>

                        <p name="StartTime">
                            <xsl:value-of select="concat(format-number($objperiod/p[@name='sHour'],'00'),':',format-number($objperiod/p[@name='sMinute'],'00'))"/>
                        </p>
                        <p name="day">
                            <xsl:value-of select="$objperiod/p[@name='day']"/>
                        </p>
                        <p name="interval">
                            <xsl:value-of select="$objperiod/p[@name='interval']"/>
                        </p>
                    </item>
                </list>
                </xsl:for-each>
            </Object>
        </xsl:template>  

これにより、次の結果が得られます。

   <Object class="Items" distName="A-1/B-1/Item-0">
       <p name="IsPresent">1</p>
       <p name="StartDate">2013-02-11T00:00:00+02:00:00</p>
       <p name="StopDate">2013-02-21T00:00:00+02:00:00</p>
       <list name="TimePeriod">
           <item>
               <p name="id">CPU</p>
               <p name="StartTime">00:00</p>
               <p name="day">0</p>
               <p name="interval">1</p>
           </item>
       </list>
       <list name="TimePeriod">
           <item>
               <p name="id"/>
               <p name="StartTime">00:00</p>
               <p name="day">0</p>
               <p name="interval">1</p>
           </item>
       </list>
       <list name="TimePeriod">
           <item>
               <p name="id"/>
               <p name="StartTime">00:00</p>
               <p name="day">0</p>
               <p name="interval">1</p>
           </item>
       </list>
   </Object>
于 2013-06-20T23:24:44.383 に答える