在MathML中,如何根据父元素及其父元素删除特定元素?

时间:2014-01-04 17:25:10

标签: xslt

请帮我看一下mmlmsubsup的第三个孩子以mmlmi为属性开始。

找到下面给出的XML,建议根据其位置和父级删除特定元素。

<article><mmlmath><mmlmsubsup><mmlmrow><mmlmi>A</mmlmi></mmlmrow><mmlmrow><mmlmi>b</mmlmi></mmlmrow><mmlmrow><mmlmi mathcolor="magenta">#</mmlmi><mmlmo>(</mmlmo><mmlmo>c</mmlmo><mmlmo>)</mmlmo></mmlmrow></mmlmsubsup></mmlmath></article>

SubSup.xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

<xsl:template match="mmlmsubsup">
    <mmlmsubsup>
            <xsl:for-each select="child::*[1]">
                    <xsl:choose>
                        <xsl:when test="child::*[1][name()='mmlmrow']">
                            <xsl:copy><xsl:apply-templates/></xsl:copy>
                        </xsl:when>

                        <xsl:otherwise><xsl:copy><xsl:apply-templates/></xsl:copy></xsl:otherwise>
                    </xsl:choose>
            </xsl:for-each>

            <xsl:for-each select="child::*[2]">
                    <xsl:choose>
                        <xsl:when test="child::*[1][name()='mmlmrow']">
                            <xsl:for-each select="mmlmrow">
                                <xsl:if test="child::*[1][name()='mmlmi'][@mathcolor]">delete</xsl:if>
                                <xsl:if test="not(child::*[name()='mmlmi'][@mathcolor])"><xsl:copy><xsl:apply-templates/></xsl:copy></xsl:if>
                            </xsl:for-each>
                            <xsl:copy><xsl:apply-templates/></xsl:copy>
                        </xsl:when>

                        <xsl:otherwise><xsl:copy><xsl:apply-templates/></xsl:copy></xsl:otherwise>
                    </xsl:choose>
            </xsl:for-each>

            <xsl:for-each select="child::*[3]">
                    <xsl:choose>
                        <xsl:when test="child::*[1][name()='mmlmrow']">
                            <xsl:for-each select="mmlmrow">
                                <xsl:if test="child::*[1][name()='mmlmi'][@mathcolor]">delete</xsl:if>
                                <xsl:if test="not(child::*[name()='mmlmi'][@mathcolor])"><xsl:copy><xsl:apply-templates/></xsl:copy></xsl:if>
                            </xsl:for-each>
                            <xsl:copy><xsl:apply-templates/></xsl:copy>
                        </xsl:when>

                        <xsl:otherwise><xsl:copy><xsl:apply-templates/></xsl:copy></xsl:otherwise>
                    </xsl:choose>
            </xsl:for-each>
    </mmlmsubsup>
</xsl:template>

</xsl:stylesheet>

必需的OutPut:

删除属性“mathcolor”的“mmlmi”元素,如果mmlmi被发现为mmlmsubsub ancetor的第二个和第三个mmlmrow的第一个孩子。

1 个答案:

答案 0 :(得分:1)

  

如果找到mmlmi,则删除属性“mathcolor”的“mmlmi”元素   mmlmsubsub ancetor的第二个和第三个mmlmrow的第一个孩子。

认为转换为:

<xsl:template match="mmlmi[@mathcolor]
                     [local-name(ancestor::mmlmsubsup/mmlmrow[2]/*[1])='mmlmi']
                     [local-name(ancestor::mmlmsubsup/mmlmrow[3]/*[1])='mmlmi']" />

很难确定,因为(1)配方不太清楚,(2)源XML不是很好的测试材料。