我有以下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>
我无法将最后的span
和p
元素放在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,而且我还是个初学者。
答案 0 :(得分:1)
要移动兄弟姐妹sign
和p
作为niv1
的子代,您需要做几处更改。
如下修改与niv1
匹配的模板。在此模板中,sign
之后的兄弟姐妹p
和niv1
的第一个匹配项已使用一种模式作为其子节点,以便以后可以将其删除。
<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>
其他任何sign
和p
都被删除。
<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>