输入xml:
<article>
<sb:title>
<sb:maintitle>
An
<mml:math>
R
<superscript>
4
</superscript>
</mml:math>
spacetime with a Cauchy surface which is not
<mml:math>
R
<superscript>
3
</superscript>
</mml:math>
</sb:maintitle>
</sb:title>
</article>
预期输出xml:
<article>
<sb:title>
<sb:maintitle>
An
<mml:math>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
spacetime with a Cauchy surface which is not
<mml:math>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</sb:maintitle>
</sb:title>
</article>
到目前为止我正在使用这个xslt:
<article>
<xsl:apply-templates select="child::article/sb:title/sb:maintitle/mml:math"/>
</article>
<xsl:template match="child::article/sb:title/sb:maintitle/mml:math">
<mml:math>
<mml:msup>
<mml:mrow><xsl:value-of select="?"/></mml:mrow>
<mml:mrow><xsl:value-of select="normalize-space(superscript)"/></mml:mrow>
</mml:msup>
</mml:math>
</xsl:template>
我使用上标获得第二个mml:mrow值。但我不知道如何获得第一个mml:行值?
不要更改应用模板;以及我必须在我的xsl(mml:mrow)中编写而不是&#34;?&#34;。
任何人都可以帮助我吗?
答案 0 :(得分:0)
如果您只想将XML的一部分转换为其他内容,那么通常最好从identity template开始,它将按原样复制节点
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
这意味着您只需要为希望转换的节点编写模板。在这种情况下,您似乎正在转换具有mml:math
元素作为子元素的superscript
元素。因此,模板匹配将如下所示:
<xsl:template match="mml:math[superscript]">
要输出第一个mmrow
,您只需要获取第一个text()
节点,如下所示:
<mml:mrow>
<mml:mi><xsl:value-of select="text()"/></mml:mi>
</mml:mrow>
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:sb="sb" xmlns:mml="mml">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mml:math[superscript]">
<mml:math>
<mml:msup>
<mml:mrow>
<mml:mi><xsl:value-of select="text()"/></mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn><xsl:value-of select="normalize-space(superscript)"/></mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</xsl:template>
</xsl:stylesheet>
应用于此XML
<article xmlns:sb="sb" xmlns:mml="mml">
<sb:title>
<sb:maintitle>
An
<mml:math>
R
<superscript>
4
</superscript>
</mml:math>
spacetime with a Cauchy surface which is not
<mml:math>
R
<superscript>
3
</superscript>
</mml:math>
</sb:maintitle>
</sb:title>
</article>
然后输出以下内容
<article xmlns:sb="sb" xmlns:mml="mml">
<sb:title>
<sb:maintitle>
An
<mml:math>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
spacetime with a Cauchy surface which is not
<mml:math>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</sb:maintitle>
</sb:title>
</article>
请注意,我必须编写一些名称空间,因为它们未在原始问题中显示。