我正在尝试将所有<list>
元素包装在<div>
中。<list>
元素都是彼此的兄弟姐妹。我认为将第一个元素匹配并将模板应用于所有元素,并且在<div>
中的所有兄弟姐妹都足够了,但是我似乎在这里缺少某些内容。
我有以下XML:
<section.body>
<para>
<list>
...
</list>
<list>
...
</list>
<list>
...
</list>
</para>
</section.body>
和以下XSLT:
<xsl:template match="section.body/para/list[1]">
<div>
<xsl:attribute name="class">
<xsl:value-of select="'&listWrapperClass;'"/>
</xsl:attribute>
<xsl:apply-templates select=".|following-sibling::list"/>
</div>
</xsl:template>
带有预期的结果:
<div class="sectionClass">
<div class="paraClass">
<div class="listWrapperClass">
<div class="listClass"/>
<div class="listClass"/>
<div class="listClass"/>
<div class="listClass"/>
</div>
</div>
</div>
试图应用模板并将其碎裂时,这似乎被循环陷入困境。不太确定我在这里缺少什么,所以会不胜感激!
此样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="section.body">
<div class="sectionClass">
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="section.body/para">
<div class="paraClass">
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="section.body/para/list[1]">
<div>
<xsl:attribute name="class">
<xsl:value-of select="'listWrapperClass'"/>
</xsl:attribute>
<div class="listClass">
<xsl:apply-templates/>
</div>
<xsl:apply-templates select="following-sibling::list" mode="group"/>
</div>
</xsl:template>
<xsl:template match="section.body/para/list[position()!=1]"/>
<xsl:template match="section.body/para/list[position()!=1]" mode="group">
<div>
<xsl:attribute name="class">
<xsl:value-of select="'listClass'"/>
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
</xsl:stylesheet>
应用于XML输入时,会产生:
<?xml version="1.0" encoding="utf-8"?>
<div class="sectionClass">
<div class="paraClass">
<div class="listWrapperClass">
<div class="listClass"> ... </div>
<div class="listClass"> ... </div>
<div class="listClass"> ... </div>
</div>
</div>
</div>