【问题标题】:how to get the text using preceding and following sibling using xslt?如何使用 xslt 使用前后同级获取文本?
【发布时间】:2014-09-16 05:18:30
【问题描述】:

输入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:row 值?

不要更改应用模板;我必须在我的 xsl(mml:mrow) 中写什么而不是“?”。

谁能帮帮我?

【问题讨论】:

  • 如果您改进问题的格式以删除代码中的空行并确保所有内容的缩进更加一致,这将有很大帮助。非常感谢。

标签: xml xslt


【解决方案1】:

如果您只想将 XML 的一部分转换为其他内容,通常最好从 identity template 开始,它将按原样复制节点

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

这意味着您只需为要转换的节点编写模板。在这种情况下,看起来您正在转换具有 superscript 子元素的 mml:math 元素。因此,模板匹配如下所示:

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

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

【讨论】:

  • 非常感谢。它真的很好用。我也为 mml:math 设置了另一个条件。那个也可以使用。我怎样才能删除这个。即除了上标子之外,是否有任何函数不选择 mml:math。例如:不(mml:数学[上标])
  • 如果您想选择一个没有superscript 子级的mml:math,请执行&lt;xsl:template match="mml:math[not(superscript)]" /&gt;
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多