1

次のxmlがあります

<xml>
  <object context="3-cumulative" >
  <metadata>
  <ref cite="4.2" relevance="first.2"/>
  </metadata>
<body>
  <para>
    <text> 
      applicable on and after December 14,2007.
    </text>
  </para>
</body>
</object>
<object context="3-cumulative" >
  <metadata>
  <ref cite="4.2" relevance="first.1"/>
  </metadata>
<body>
  <para>
    <text> 
      applicable on and after December 14,2006.
    </text>
  </para>
</body>
</object>

 <object context="3-cumulative" >
 <metadata>
  <related-content-ref cite="5 annuity" relevance="first.1"/>
</metadata>
<body>
  <para>
     <text>
       applicable on and after December 14, 2008
     </text>
   </para>
 </body>
</object>
   <mainbody>
      <num cite="4.2">4.2</num>
      <heading>Stock exchanges</heading>
      <prov-body>
        <text>
           Notwithstanding the provisions of a convention ... as defined in the
           <italic>Income Tax Act</italic>.
        </text>
     <prov>
            <num cite="5 annuity"/>
            <heading>“annuity”&lt;/heading>
            <text>
            <term>“annuity”&lt;/term>does not include any pension payment ...
           </text>
            <text>
            any pension payment ...
           </text>
  </prov>
 </prov-body>
  </mainbody>
 </xml>  

object/metadata/ref/@cite が「mainbody」num/@cite で見つかったかどうかを確認する必要があります。次に、オブジェクトの para/text を最初の Text ノードの最後にコピーし、object/metadata/ref で並べ替える必要があります。 /@関連性。

出力は次のようになります。

<xml>
 <mainbody>
 <num cite="4.2">4.2</num>
 <heading>Stock exchanges</heading>
 <prov-body>
  <text>
    Notwithstanding the provisions of a convention ... as defined in the
    <italic>Income Tax Act</italic>.
    **applicable on and after December 14, 2006**
    **applicable on and after December 14, 2007**
  </text>
 <prov>
        <num cite="5 annuity"/>
        <heading>“annuity”&lt;/heading>
        <text>
        <term>“annuity”&lt;/term>does not include any pension payment ...
         **applicable on and after December 14, 2008**
        </text>
        <text>
        any pension payment ...
       </text>
   </prov>
  </prov-body>
 </mainbody>
</xml>  
4

1 に答える 1

2

このXSLT1.0変換version(属性が2.0に変更され、変換がXSLT 2.0プロセッサーで実行された場合も同じ結果が生成されます):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kRefByCite"
      match="metadata/*" use="@cite" />

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

 <xsl:template match=
   "text[(preceding::text[1]|preceding::num[1])
          [last()]
              [key('kRefByCite', @cite)]]">
   <text>
     <xsl:apply-templates/>
     <xsl:for-each select=
       "key('kRefByCite', preceding::num[1]/@cite)">
       <xsl:sort select="@relevance"/>

       <xsl:value-of select="../../body/para/text"/>
     </xsl:for-each>
   </text>
 </xsl:template>
 <xsl:template match=
   "node()
    [parent::* and not(ancestor-or-self::mainbody)]"/>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合:

<xml>
    <object context="3-cumulative" >
        <metadata>
            <ref cite="4.2" relevance="first.2"/>
        </metadata>
        <body>
            <para>
                <text>
          applicable on and after December 14,2007.
                </text>
            </para>
        </body>
    </object>
    <object context="3-cumulative" >
        <metadata>
            <ref cite="4.2" relevance="first.1"/>
        </metadata>
        <body>
            <para>
                <text>
          applicable on and after December 14,2006.
                </text>
            </para>
        </body>
    </object>
    <object context="3-cumulative" >
        <metadata>
            <related-content-ref cite="5 annuity" relevance="first.1"/>
        </metadata>
        <body>
            <para>
                <text>
           applicable on and after December 14, 2008
                </text>
            </para>
        </body>
    </object>
    <mainbody>
        <num cite="4.2">4.2</num>
        <heading>Stock exchanges</heading>
        <prov-body>
            <text>
        Notwithstanding the provisions of a convention ... as defined in the
                <italic>Income Tax Act</italic>.
            </text>
            <prov>
                <num cite="5 annuity"/>
                <heading>“annuity”&lt;/heading>
                <text>
                    <term>“annuity”&lt;/term>does not include any pension payment ...
                </text>
                <text>
           any pension payment ...
                </text>
            </prov>
        </prov-body>
    </mainbody>
</xml>

必要な正しい結果を生成します。

<xml>
   <mainbody>
      <num cite="4.2">4.2</num>
      <heading>Stock exchanges</heading>
      <prov-body>
         <text>
        Notwithstanding the provisions of a convention ... as defined in the
                <italic>Income Tax Act</italic>.

          applicable on and after December 14,2006.

          applicable on and after December 14,2007.
                </text>
         <prov>
            <num cite="5 annuity"/>
            <heading>“annuity”&lt;/heading>
            <text>
               <term>“annuity”&lt;/term>does not include any pension payment ...

           applicable on and after December 14, 2008
                </text>
            <text>
           any pension payment ...
                </text>
         </prov>
      </prov-body>
   </mainbody>
</xml>

説明

IDルールの適切なオーバーライドxsl:keyとおよびkey()関数の使用。

于 2012-05-24T04:30:09.470 に答える