2015-04-22 21 views
0

請建議如何合併具有相同名稱的元素[element mi only]連續出現。只有元素英里 [沒有任何屬性]只需要合併。 元素MI可能有任何父項。如何合併連續發現的同名元素

XML:

<article> 
    <math> 
     <mtext>one</mtext> 
     <mi>i</mi> 
     <mi>n</mi> 
     <mi>s</mi> 
     <mi>t</mi> 
     <mtext>The</mtext> 
     <mi>s</mi> 
     <mi>m</mi> 
     <mrow> 
      <mi>a</mi> 
      <mi>l</mi> 
      <mi>l</mi> 
     </mrow> 
     <mi>y</mi> 
     <mn>8</mn> 
     <mi>z</mi> 
    </math> 
</article> 

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="mi"> 
     <xsl:choose> 
      <xsl:when test="not(preceding-sibling::*[name()='mi'][1]) and not(following-sibling::*[name()='mi'][1])"> 
       <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
      </xsl:when> 

      <xsl:when test="following-sibling::*[1][name()='mi']"> 
       <xsl:variable name="varcnt"> 
        <xsl:value-of select="count(following-sibling::*)"/> 
       </xsl:variable> 
       <xsl:copy> 
       <xsl:for-each select="1 to number($varcnt)"> 
        <xsl:if test="name()='mi'"> 
        <xsl:apply-templates/> 
        </xsl:if> 
       </xsl:for-each> 
       </xsl:copy> 
      </xsl:when> 
      <xsl:otherwise><xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy></xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

所需的輸出:

<article> 
    <math> 
     <mtext>one</mtext> 
     <mi variant="italic">inst</mi> 
     <mtext>The</mtext> 
     <mi variant="italic">sm</mi> 
     <mrow> 
      <mi variant="italic">all</mi> 
     </mrow> 
     <mi>y</mi> 
     <mn>8</mn> 
     <mi>z</mi> 
    </math> 
</article> 

回答

1

使用for-each-group group-adjacent="boolean(self::mi)",如在

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes"/> 

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

    <xsl:template match="*[mi]"> 
     <xsl:copy> 
     <xsl:for-each-group select="*" group-adjacent="boolean(self::mi)"> 
      <xsl:choose> 
      <xsl:when test="current-grouping-key() and count(current-group()) gt 1"> 
       <mi variant="italic"><xsl:apply-templates select="current-group()/node()"/></mi> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

先生,非常感謝您的不錯的代碼和建議,再加上1。 –