请建议识别或删除内容为'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'无法删除。
答案 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