我正在使用 XSLT 将 XML 文档从一种文档类型转换为另一种。以简化的形式,我有一些看起来像这样的东西:
<section>
<title>Title</title>
<a>content1</a>
<a>content2</a>
<a>content3</a>
<a>content4</a>
<b>other content</b>
<a>content5</a>
<a>content6</a>
<a>content7</a>
<c>other content</c>
<a>content8</a>
<a>content9</a>
<a>content10</a>
</section>
我想要的是在<a>
元素组周围放置一个包装器,因此翻译后的结果如下所示:
<section>
<title>Title</title>
<a-wrapper>
<a>content1</a>
<a>content2</a>
<a>content3</a>
<a>content4</a>
</a-wrapper>
<b>other content</b>
<a-wrapper>
<a>content5</a>
<a>content6</a>
<a>content7</a>
</a-wrapper>
<c>other content</c>
<a-wrapper>
<a>content8</a>
<a>content9</a>
<a>content10</a>
</a-wrapper>
</section>
我当前的模板如下所示:
<xsl:template match="a">
<xsl:choose>
<xsl:when test="not(preceding-sibling::a)">
<xsl:element name="a-wrapper">
<xsl:element name="a">
<xsl:apply-templates/>
</xsl:element>
<xsl:apply-templates select="following-sibling::a[generate-id(preceding-sibling::a[last()]) = generate-id(current())]"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="a">
<xsl:apply-templates/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这让我走到了一半。问题是 apply-templates 标签中的 select 子句正在获取所有<a>
标签,当我希望它在第一个非标签处停止时<a>
,即第一个<a>
标签的处理是将所有 10 个<a>
标签放在第一个标签中<a-wrapper>
,当我只想要前四个时。这也具有插入嵌套<a-wrapper>
标签的效果,例如由第五个标签生成的<a>
标签,这是 DTD 不允许的。
<a>
所以问题是,我如何选择以第一个非标签结尾的后续兄弟姐妹的子集?