我需要移动输出中显示<sub>
的<sup>
元素。我可以移动<sup>
元素。子元素没有移动。我还需要相应地重命名<msub>
元素<msup>
。如果我运行 XSLT 两次,我可以获得输出。但我不想那样做。请纠正我犯错的地方。我应该使用 XSLT1.0
输入 XML:
<?xml version='1.0' encoding='UTF-8' ?>
<chapter xmlns="http://www.w3.org/1998/Math/MathML">
<math display="block">
<mfenced>
<mrow>
<mfrac>
<mrow>
<mi>v</mi>
<sub>
<mrow><mi>n</mi></mrow>
</sub>
</mrow>
<mrow>
<mi>v</mi>
<sub>
<mrow><mi>d</mi></mrow>
</sub>
</mrow>
</mfrac>
</mrow>
</mfenced>
<sup><mrow><mn>2</mn></mrow></sup>
</math>
</chapter>
示例 XSLT 尝试:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns="http://www.w3.org/1998/Math/MathML" exclude-result-prefixes="m">
<xsl:output method="xml"/>
<xsl:template match="@* | node()">
<xsl:choose>
<xsl:when test="self::*/following-sibling::*[1]/self::m:sub"></xsl:when>
<xsl:when test="self::*/following-sibling::*[1]/self::m:sup"></xsl:when>
<xsl:when test="self::*/following-sibling::*[1]/self::m:subsup"></xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="m:sub">
<msub>
<xsl:copy-of select="self::*/preceding-sibling::*[1]"/>
<xsl:apply-templates/>
</msub>
</xsl:template>
<xsl:template match="m:subsup">
<msubsup>
<xsl:copy-of select="self::*/preceding-sibling::*[1]"/>
<xsl:apply-templates/>
</msubsup>
</xsl:template>
<xsl:template match="m:sup">
<msup>
<xsl:copy-of select="self::*/preceding-sibling::*[1]"/>
<xsl:apply-templates/>
</msup>
</xsl:template>
</xsl:stylesheet>
所需输出:
<?xml version='1.0' ?>
<chapter xmlns="http://www.w3.org/1998/Math/MathML">
<math display="block">
<msup>
<mfenced>
<mrow>
<mfrac>
<mrow>
<msub><mi>v</mi><mrow><mi>n</mi></mrow></msub>
</mrow>
<mrow>
<msub><mi>v</mi><mrow><mi>d</mi></mrow></msub>
</mrow>
</mfrac>
</mrow>
</mfenced>
<mrow><mn>2</mn></mrow>
</msup>
</math>
</chapter>