重组节点(Restructure nodes)

2019-10-16 18:07发布

我有以下结构的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”</heading> 
                <text> 
                <term>“annuity”</term>does not include any pension payment ... 
                </text> 
               <text> 
                 any pension payment ... 
               </text> 
           </prov> 
       </prov-body> 
      </mainbody> 
    </xml>   

我所需要的,如果任何对象/元/ REF举已“型主体”发现/ @ NUM / @引用和对象/ @背景是“1累积”,那么对/从对象文本应该在第一文本节点的末尾复制并且应该由对象/元数据/ REF / @相关性,或者如果是排序的任何对象/元数据/ REF / @举已在“型主体”找到NUM / @引用和对象/ @上下文是“3-累积”然后对位/文本从对象应该与它自己的文本elemet第一文本节点之后复制,应由对象/元/ REF / @相关性排序是

输出应该是:

<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”</heading> 
        <text> 
        <term>“annuity”</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>   

Answer 1:

这一转变

<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”</heading>
                    <text>
                    <term>“annuity”</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”</heading>
            <text>
               <term>“annuity”</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>


文章来源: Restructure nodes
标签: xslt