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="1-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="1-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> 
        <num cite="2" type="para">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="1 annuity"/> 
              <num cite="5 annuity"/> 
              <num cite="3 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 で見つかり、object/@context が「1-cumulative」の場合、オブジェクトの para/text を最初の Text ノードの最後にコピーする必要がありますobject/metadata/ref/@relevance でソートするか、object/metadata/ref/@cite が「mainbody」num/@cite で見つかった場合、object/@context は「3-cumulative」で、para/text from object は、独自の Text 要素を持つ最初の Text ノードの後に​​コピーし、object/metadata/ref/@relevance でソートする必要があります

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

<xml> 
 <mainbody> 
 <num cite="4.2">4.2</num> 
 <num cite="2" type="para">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** 
  </text> 
  <text>   **applicable on and after December 14, 2007** </text>

 <prov> 
        <num cite="1 annuity"/> 
        <num cite="5 annuity"/> 
        <num cite="3 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

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:key name="kRefByCite1"
          match="*[@context='1-cumulative']/metadata/*"
          use="@cite" />

     <xsl:key name="kRefByCite3"
          match="*[@context='3-cumulative']/metadata/*"
          use="@cite" />

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

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

           <xsl:value-of select="../../body/para/text"/>
         </xsl:for-each>
       </text>
       <xsl:for-each select=
         "key('kRefByCite3', (.|..)/preceding-sibling::num/@cite)">
         <xsl:sort select="@relevance"/>

         <text><xsl:value-of select="../../body/para/text"/></text>
       </xsl:for-each>

     </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="1-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="1-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>
            <num cite="2" type="para">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="1 annuity"/>
                  <num cite="5 annuity"/>
                  <num cite="3 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>
      <num cite="2" type="para">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.
         </text>
         <text>
                 applicable on and after December 14,2007.
          </text>
         <prov>
            <num cite="1 annuity"/>
            <num cite="5 annuity"/>
            <num cite="3 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>
于 2012-05-26T17:25:01.233 に答える