如何使用 XSLT 实现 Presentation MathML 到 Content MathML 转换器?

How can I implement a Presentation MathML to Content MathML translator using XSLT?

我想使用 XSLT 实现 P2C 转换器。例如:

<mrow>
  <mi>x</mi>
  <mo>+</mo>
  <msup>
    <mi>y</mi>
    <mn>3</mn>
  </msup>
</mrow>

进入 C-MathML 术语。

<apply>
  <csymbol>mrow</csymbol>
  <ci>x</ci>
  <csymbol>+</csymbol>
  <apply>
    <csymbol>msup</csymbol>
    <ci>y</ci>
    <cn>3</cn>
  </apply>
</apply>

规则如下:

1) <mi> 转到 <ci>

2) <mo> 转到 <csymbol>

3) 所有其他元素 <xxx> 转到 <apply><csymbol>xxx</csymbol> ... </apply>

以下是我到目前为止所写的内容,但我在实施第 3 条规则时遇到了困难,因为我对 XSLT 的经验不多。有人可以帮忙吗?

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:mml="http://www.w3.org/1998/Math/MathML" >

  <xsl:output method="xml" />

  <xsl:template mode="p2c" match="*">
    <xsl:copy>
      <xsl:copy-of select="@" />
      <xsl:apply-templates mode="p2c"/>
    </xsl:copy>
  </xsl:template>

  <!-- mn -->

  <xsl:template mode="p2c" match="mml:mn">
    <mml:cn><xsl:apply-templates mode="p2c"/></mml:cn>
  </xsl:template>

  <!-- mo -->
  <xsl:template mode="p2c" match="mml:mo">
    <mml:csymbol><xsl:apply-templates mode="p2c"/></mml:csymbol>
  </xsl:template>

  <!-- mi -->
  <xsl:template mode="p2c" match="mml:mi/text()">
    <mml:ci><xsl:value-of select="."/></mml:ci>
  </xsl:template>



</xsl:stylesheet>

all other elements <xxx> go to <apply><csymbol>xxx</csymbol> ... </apply>

简直了

<xsl:template match="*">
  <apply>
   <csymbol>
     <xsl:value-of select="name()"/>
   </csymbol>
 </apply>
</xsl:template>