我正在尝试将所有<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>
在尝试应用模板并闯入我时,似乎陷入了循环。不太确定我在这里缺少什么,所以任何帮助将不胜感激!
答案 0 :(得分:0)
此样式表
<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>