如何在特定的msub中删除'mtext'元素(如果没有前面的文本)

时间:2014-08-11 13:23:59

标签: xml xslt xslt-2.0

请建议识别或删除内容为'aaaaa'的mtext,这是'msub'中的第一个文本元素(即没有前面的:: text()[1])作为其祖先。在输入xml中,我保留了三个'msub',除了第二个,第一个和最后一个mtext要删除。在第三个'msub'前面:: text [1]是3,但它不存在于第三个msub中。元素'mtext'可能有任何父母或祖先。

输入XML :(没有为输入xml提供缩进或空格,因为我使用'text()'方法)

<article><math><msub><mrow><mtext>aaaaa</mtext><!--remove it--><mn>2</mn></mrow><mn>3</mn></msub><msub><mrow><mn>23</mn><mfraction><mrow><mtext>aaaaa</mtext><!--no need to remove, bcs preceded text is 23 within msub--><mn>2</mn></mrow><mrow><mn>3</mn></mrow></mfraction></mrow></msub><msub><mover><mrow><mrow><mtext>aaaaa</mtext><!--remove it, bcs aaaa is first text within msub--><mi>h</mi></mrow></mrow><mrow><mn>2</mn></mrow></mover><mn>2</mn></msub></math></article>

输入XML:带缩进

<article>
<math>
    <msub>
    <mrow>
    <mtext>aaaaa</mtext><!--remove it-->
    <mn>2</mn>
    </mrow>
    <mn>3</mn>
    </msub>
    <msub>
    <mrow>
    <mn>23</mn>
    <mfraction>
    <mrow>
    <mtext>aaaaa</mtext><!--no need to remove, bcs preceded text is 23 within msub-->
    <mn>2</mn>
    </mrow>
    <mrow>
    <mn>3</mn>
    </mrow>
    </mfraction>
    </mrow>
    </msub>
    <msub>
    <mover>
    <mrow>
    <mrow>
    <mtext>aaaaa</mtext><!--remove it, bcs aaaa is first text within msub-->
    <mi>h</mi>
    </mrow>
    </mrow>
    <mrow>
    <mn>2</mn>
    </mrow>
    </mover>
    <mn>2</mn>
    </msub>
</math>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 <xsl:template match="node()|@*">
      <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
 </xsl:template>
 <xsl:template match="mtext[contains(., 'aaaaa')]">
      <xsl:choose>
                <xsl:when test="preceding::text()[1][ancestor::msub][normalize-space(.)!='']">
                <xsl:copy-of select="."/>
           </xsl:when>
           <xsl:otherwise><del/></xsl:otherwise>
      </xsl:choose>
 </xsl:template>

必需的OutPut:

<article>
  <math>
  <msub>
     <mrow>
        <del/>
        <!--remove it--><mn>2</mn>
     </mrow>
     <mn>3</mn>
  </msub>
  <msub>
     <mrow>
        <mn>23</mn>
        <mfraction>
           <mrow>
              <mtext>aaaaa</mtext>
              <!--no need to remove, bcs preceded text is 23 within msub--><mn>2</mn>
           </mrow>
           <mrow>
              <mn>3</mn>
           </mrow>
        </mfraction>
     </mrow>
  </msub>
  <msub>
     <mover>
        <mrow>
           <mrow>
              <del/>
              <!--remove it, bcs aaaa is first text within msub--><mi>h</mi>
           </mrow>
        </mrow>
        <mrow>
           <mn>2</mn>
        </mrow>
     </mover>
     <mn>2</mn>
  </msub>
 </math>
</article>

使用我的代码,第二个'sub',第一个'mtext'无法删除。

1 个答案:

答案 0 :(得分:1)

(删除了之前的内容)

如果我最终(!)正确理解了这一点,那么你的第二个模板必须是:

<xsl:template match="msub//mtext[contains(., 'aaaaa')]">
    <xsl:choose>
        <xsl:when test="preceding::*[generate-id(ancestor::msub)=generate-id(current()/ancestor::msub)][text()]">
            <xsl:copy-of select="."/>
        </xsl:when>
        <xsl:otherwise>
            <DELETED/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

这将查看以前与相同 msub元素后代的元素作为当前mtext