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>  

我需要查看是否在“mainbody”num/@cite 中找到了任何对象/元数据/ref/@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

此 XSLT 1.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>

说明

适当覆盖身份规则和功能xsl:key的使用key()

于 2012-05-24T04:30:09.470 回答