XSLT应用模板问题

时间:2018-03-09 14:19:59

标签: xml xslt xslt-1.0 xslt-2.0

如果我们说为特定节点应用模板,它将在整个xml中应用于找到该节点/标记的任何位置。

我的问题是我有一个xml,我需要根据条件应用模板,基本上维护一些顺序。

输入xml:

enter code here
<step>
 <note>..</note>
 <para>..</para>
 <table>
  ..
  ..
 </table>
 <note>...</note>
 <table>
 ..
 ..
 </table>
 <table>
 ..
 ..
</table>
<note>...</note>
<text>...</text>
</step>

输出应该是,

<fc:topic>
 <fc:subTask id="S0EC0A941" lbl="E.">
 <fc:para>..</fc:para>
 <fc:text>...</fc:text>
 <fc:note>..</fc:note>
 <fc:table>
  ..
  ..
  </fc:table>
  <fc:note>...</fc:note>
  <fc:table>
   ..
   ..
  </fc:table>
  <fc:table>
   ..
   ..
  </fc:table>
 <fc:note>...</fc:note>
 </fc:subTask>
</fc:topic>

我的XSLT是这样的,

<xsl:template match="step">
<fc:topic>
    <fc:subTask>
        <xsl:if test="@id">
            <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
        </xsl:if>
        <xsl:attribute name="lbl"><xsl:number format="A."/></xsl:attribute>         
        <xsl:apply-templates select="para"/>
        <xsl:apply-templates select="text"/>
        <xsl:apply-templates select="note"/>
        <xsl:apply-templates select="table"/>               
    </fc:subTask>
</fc:topic>

需要根据以下条件重组XSL,

我只想在笔记不是作为桌子的前一个或后一个兄弟的情况下应用笔记模板。如果它的后续或前面的兄弟表应该进入表之间,表格之下或之上,就像在输出中一样。

谢谢

1 个答案:

答案 0 :(得分:2)

替换

    <xsl:apply-templates select="para"/>
    <xsl:apply-templates select="text"/>
    <xsl:apply-templates select="note"/>
    <xsl:apply-templates select="table"/>  

<xsl:apply-templates select="para, text, note[not(preceding-sibling::*[1][self::table] | following-sibling::*[1][self::table])]"/>
<xsl:apply-templates select="table | note[preceding-sibling::*[1][self::table] or following-sibling::*[1][self::table]]"/>