【发布时间】:2014-10-08 06:34:55
【问题描述】:
请提出建议。如果元素“mfenced”没有像“munderover”或“mfrac”这样的元素作为其后代,则需要将其更改为元素“mo”。 在 xml 中找到“text1”和“text2”文本,在这些区域我的代码无法更改为“mo”。
输入 XML:
<article>
<math>
<mi>P</mi>
<mfenced open="(" close=")"><!--To be changed to 'mo', bcs 'mfenced' not having mfrac or munderover as its descendant-->
<mi>g</mi>
</mfenced>
<mfenced open="[" close="]"><!--To be retained as it is, bcs, mfenced having either mfrac or munderover as its descendant-->
<mfenced open="(" close=")"><!--To be retained as it is, bcs, mfenced having either mfrac or munderover as its descendant-->
<mi>g</mi>
<mo>=</mo>
<munderover>
<mrow><mn>1</mn></mrow>
<mfenced open="(" close=")"><!--To be changed to 'mo', bcs 'mfenced' not having mfrac or munderover as its descendant-->
<mrow><mi>text1</mi></mrow>
</mfenced>
<mrow><mi>N</mi></mrow>
</munderover>
</mfenced>
<mi>N</mi>
</mfenced>
<mfenced open="[" close="]"><!--To be retained as it is, bcs, mfenced having either mfrac or munderover as its descendant-->
<mfenced open="(" close=")"><!--To be retained as it is, bcs, mfenced having either mfrac or munderover as its descendant-->
<mfrac>
<mrow>
<mfenced open="(" close=")"><!--To be changed to 'mo', bcs not having mfrac or munderover as its descendant-->
<mi>text2</mi>
</mfenced>
</mrow>
<mrow><mo>2</mo></mrow>
</mfrac>
</mfenced>
</mfenced>
</math>
</article>
XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mfenced">
<xsl:choose>
<xsl:when test="descendant::mfrac|descendant::munderover">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:element name="mo">
<xsl:value-of select="@open"/>
</xsl:element>
<xsl:apply-templates/>
<xsl:element name="mo">
<xsl:value-of select="@close"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="//comment"/>
</xsl:stylesheet>
要求的结果:
<article>
<math>
<mi>P</mi>
<mo>(</mo>
<mi>g</mi>
<mo>)</mo>
<mfenced open="[" close="]">
<mfenced open="(" close=")">
<mi>g</mi>
<mo>=</mo>
<munderover>
<mrow>
<mn>1</mn>
</mrow>
<mo>(</mo><!--My code failing here-->
<mi>text1</mi>
<mo>)</mo>
<mrow>
<mi>N</mi>
</mrow>
</munderover>
</mfenced>
<mi>N</mi>
</mfenced>
<mfenced open="[" close="]">
<mfenced open="(" close=")">
<mfrac>
<mrow>
<mo>(</mo><!--My code failing here-->
<mi>text2</mi>
<mo>)</mo>
</mrow>
<mrow>
<mo>2</mo>
</mrow>
</mfrac>
</mfenced>
</mfenced>
</math>
</article>
【问题讨论】: