如何为msub | msup | msubsup元素的第二个子元素插入mpadded标记。我的编码不适用于嵌套子(msub | msup | msubsup),我也得到了重复的值。请建议。
Input.xml中
<root>
<disp-formula id="eqn2">
<label>2</label>
<math>
<msup>
<mrow>
<msub>
<mrow><mi>E</mi></mrow>
<mrow><mi>T</mi></mrow>
</msub>
</mrow>
<mrow><mn>2</mn></mrow>
</msup>
</math>
</disp-formula>
XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="msub|msup|msubsup">
<xsl:element name="{name()}">
<xsl:for-each select="child::*">
<xsl:choose>
<xsl:when test="position() eq 3">
<xsl:element name="mpadded">
<xsl:attribute name="voffset">
<xsl:choose>
<xsl:when test="parent::*[name() eq 'msubsup']"><xsl:text>-0.16ex</xsl:text></xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:copy-of select="."/>
</xsl:element>
</xsl:when>
<xsl:when test="position() eq 2">
<xsl:element name="mpadded">
<xsl:attribute name="voffset">
<xsl:choose>
<xsl:when test="parent::*[name() eq 'msub']"><xsl:text>0.3ex</xsl:text></xsl:when>
<xsl:when test="parent::*[name() eq 'msup']"><xsl:text>-0.4ex</xsl:text></xsl:when>
<xsl:when test="parent::*[name() eq 'msubsup']"><xsl:text>0.15ex</xsl:text></xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:copy-of select="."/>
</xsl:element>
</xsl:when>
<xsl:when test="position() eq 1">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:element>
<xsl:next-match/>
</xsl:template>
</xsl:stylesheet>
必需的OutPut:
<root>
<disp-formula id="eqn2">
<label>2</label>
<math>
<msup>
<mrow>
<msub>
<mrow><mi>E</mi></mrow>
<mpadded voffset="0.3ex"><mrow><mi>T</mi></mrow></mpadded>
</msub>
</mrow>
<mpadded voffset="-0.4ex"><mrow><mn>2</mn></mrow></mpadded>
</msup>
</math>
</disp-formula>
答案 0 :(得分:1)
添加一个模板,该模板应用于msub |的2个子节点msup | msubup
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="msub/*[count(preceding-sibling::*)=1]|msup/*[count(preceding-sibling::*)=1]|msubsup/*[count(preceding-sibling::*)=1]">
<mpadded>
<xsl:attribute name="voffset">
<xsl:choose>
<xsl:when test="parent::msub">0.3ex</xsl:when>
<xsl:when test="parent::msup">-0.4ex</xsl:when>
<xsl:when test="parent::msubsup">0.15ex</xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</mpadded>
</xsl:template>
</xsl:stylesheet>