如何使用xslt使用前后兄弟来获取文本?

时间:2014-09-16 05:18:31

标签: xml xslt

输入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;。

任何人都可以帮助我吗?

1 个答案:

答案 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>

请注意,我必须编写一些名称空间,因为它们未在原始问题中显示。