我正在使用 xslt 2.0,我有以下示例 xml,我想在两个“header-gray”节点之间获取所有“header-lightgray”节点,这里的问题是:我不知道有多少“header-lightgray”那里。所以我不能使用 position() 函数。并且每个 xsl 都不支持中断。
<t>
<parent class="header-gray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
...
<parent class="header-gray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-gray"></parent>
</t>
我想通过它们并替换所有节点,用div替换header-gray和用span替换header-lightgray。预期的输出是:
<div class="header-gray">
<span class="header-lightgray"/>
<span class="header-lightgray"/>
<span class="header-lightgray"/>
...
</div>
<div class="header-gray">
<span class="header-lightgray"/>
<span class="header-lightgray"/>
<span class="header-lightgray"/>
</div>
那么该怎么做呢?
任何帮助表示赞赏。
我想根据 Jan Vlcinsky 的回答分享解决方案:
<xsl:for-each select="/t/parent[@class='header-gray']">
<xsl:variable name="ns1" select="current()/following-sibling::parent"/>
<xsl:variable name="ns2" select="current()/following-sibling::parent[@class='header-gray'][1]/preceding-sibling::parent"/>
<div class="header-gray">
<xsl:for-each select="$ns1[count(.| $ns2)=count($ns2)]">
<span class="header-lightgray"/>
</xsl:for-each>
</div>
</xsl:for-each>
我没有验证上面的代码,但它在我的真实代码中是相同的逻辑。我没有使用 xslt 2.0 的方式,因为我发现我使用的 lxml 2.3 不支持 xslt 2。