如何使用xslt转换此xml?

时间:2018-07-05 10:57:16

标签: xml xslt

我有以下XML:

<dev>
    <niv1>
        <int>blablabla</int>
        <auteur>blablabla</auteur>
        <exer>
            <p align="justif">blablabla</p>
        </exer>
    </niv1>
    <sign>M. A.</sign>
    <p align="justif">
        <pc>blablabla</pc>: blablabla2
    </p>

    <niv1>
        <int>blablabla</int>
        <auteur>blablabla</auteur>
        <exer>
            <p align="justif">blablabla</p>
        </exer>
    </niv1>
    <sign>M. A.</sign>
    <p align="justif">
        <pc>blablabla</pc>: blablabla2
    </p>
    <!--Same pattern over and over again-->
</dev>

我想要类似的东西

<article>
  <content>
    <div>
       <some tags>xxxx</some tags>
    </div>
    <span class="sign">xxx</span>
     <p class="ref">
        <p class="mini-caps">xxxx</p>: 
     </p>
   </content>
</article>

我现在拥有的xml输出看起来像这样:

<article>
  <content>
    <div>
       <some tags>xxxx</some tags>
    </div>
   </content>
</article>
<span class="sign">xxx</span>
<p class="ref">
      <p class="mini-caps">xxxx</p>: 
</p>

我无法将最后的spanp元素放在content标签中。

我的XSLT类似于(不是这里的所有文件):

<xsl:template match="niv1">
    <article>
        <content>
            <div>
                <xsl:apply-templates mode="content"/>
            </div>
            <xsl:apply-templates select="sign"/>
        </content>
    </article>
</xsl:template>

<xsl:template match="sign">
    <span class="sign">
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="p">
    <p class="ref">
        <xsl:apply-templates/>
    </p>
</xsl:template>

<xsl:template match="pc">
    <p class="mini-caps">
        <xsl:apply-templates/>
    </p>
</xsl:template>

我不知道是否可以实现我想要的目标,因为当我匹配<niv1>时,<sign><p>不是niv1的子节点。我不经常使用XSLT,而且我还是个初学者。

1 个答案:

答案 0 :(得分:1)

要移动兄弟姐妹signp作为niv1的子代,您需要做几处更改。

如下修改与niv1匹配的模板。在此模板中,sign之后的兄弟姐妹pniv1的第一个匹配项已使用一种模式作为其子节点,以便以后可以将其删除。

<xsl:template match="niv1">
    <article>
        <content>
            <div>
                <xsl:apply-templates mode="content"/>
            </div>
            <xsl:apply-templates select="following-sibling::sign[1]" mode="alter-sign" />
            <xsl:apply-templates select="following-sibling::p[1]" mode="alter-p" />
        </content>
    </article>
</xsl:template>

一种模式应用于以下模板

<xsl:template match="sign" mode="alter-sign">
    <span class="sign">
        <xsl:apply-templates />
    </span>
</xsl:template>

<xsl:template match="p" mode="alter-p">
    <p class="ref">
        <xsl:apply-templates />
    </p>
</xsl:template>

其他任何signp都被删除。

<xsl:template match="sign | p" />

这些更改提供以下输出(由于在共享输入中出现2次niv1,因此输出显示2个article节点)。

<article>
    <content>
        <div>blablablablablablablablabla</div>
        <span class="sign">M. A.</span>
        <p class="ref">
            <p class="mini-caps">blablabla</p>  : blablabla2
        </p>
    </content>
</article>
<article>
    <content>
        <div>blablablablablablablablabla</div>
        <span class="sign">M. A.</span>
        <p class="ref">
            <p class="mini-caps">blablabla</p>  : blablabla2
        </p>
    </content>
</article>