XSLT:复制 <mathml> 的所有子元素,不带 m: 命名空间,而无需为每个元素创建模板

Posted

技术标签:

【中文标题】XSLT:复制 <mathml> 的所有子元素,不带 m: 命名空间,而无需为每个元素创建模板【英文标题】:XSLT: copy all the children of <mathml> without the m: namespace without having to create a template for each element 【发布时间】:2018-05-16 05:07:20 【问题描述】:

这是我的输入:

                         <mathml>
                            <m:math xmlns:m="http://www.w3.org/1998/Math/MathML">
                                <m:mrow>
                                    <m:mtext>SL depreciation expense</m:mtext>
                                    <m:mo>=</m:mo>
                                    <m:mfrac>
                                        <m:mrow>
                                            <m:mtext>cost−residual value</m:mtext>
                                        </m:mrow>
                                        <m:mrow>
                                            <m:mtext>useful life</m:mtext>
                                        </m:mrow>
                                    </m:mfrac>
                                </m:mrow>
                            </m:math>
                        </mathml>

这是预期的输出

            <math xmlns="http://www.w3.org/1998/Math/MathML">
            <mrow>
                <mtext>SL depreciation expense</mtext>
                <mo>=</mo>
                <mfrac>
                    <mrow>
                        <mtext>cost−residual value</mtext>
                    </mrow>
                    <mrow>
                        <mtext>useful life</mtext>
                    </mrow>
                </mfrac>
            </mrow>
        </math>

我想复制没有 m: 前缀命名空间的 mathml 节点的所有子节点而不必为每个元素创建模板。 您能为此提出任何解决方案吗?

【问题讨论】:

【参考方案1】:

你可以使用下面的sn-p复制math里面的内容

<xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

要删除命名空间,您应该使用xsl:element 创建您的元素,看看this answer 会帮助您执行此操作。

【讨论】:

查看我的输出。我想复制没有 m: 前缀命名空间的节点。【参考方案2】:

尝试拥有:

<xsl:template match="m:*">
    <xsl:element name="local-name()" namespace="http://www.w3.org/1998/Math/MathML">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

见http://xsltfiddle.liberty-development.net/6qVRKvZ。

【讨论】:

以上是关于XSLT:复制 <mathml> 的所有子元素,不带 m: 命名空间,而无需为每个元素创建模板的主要内容,如果未能解决你的问题,请参考以下文章

没有 xsl:copy-of 的 XSLT 复制

MathML 标记无法在 JavaFX WebView 中正确呈现

通过xslt一步复制和操作xml元素

记录一种基于Java的MathML转图片的方法

如何使用 XSLT 复制 XML 以生成相同形式的另一个新 XML

安装MathType后在Word中复制全文时,公式部分如何自动替换为MathML LaTeX 的代码?