我有多个 xml 实例,类似于以下内容:
<refbody>
<ul>
<li><uicontrol>FOO</uicontrol>BAR</li>
</ul>
<p>Values: 000 - 999</p>
<ul>
<li><uicontrol>FOO</uicontrol>BAR</li>
<li><uicontrol>FOO</uicontrol>BAR</li>
<li><uicontrol>FOO</uicontrol>BAR</li>
<li><uicontrol>FOO</uicontrol>BAR</li>
</ul>
<p>Values:</p>
<p>lorem ipsum</p>
<p>lorem ipsum</p>
<p>lorem ipsum</p>
</refbody>
我希望发生的事情是将所有<ul>
元素合并到一个<dl>
.
每个都<li>
应该创建一个 child <dlentry>
。
每个都<uicontrol>
应该成为<dt>
它的一个孩子<dlentry>
。
中的剩余文本<li>
应该放在一个<dd>
元素中,该元素也是<dlentry>
.
我的样式表(在下面提供)已经完成了很多。我遇到麻烦的地方是最后一个要求:
任何<p>
需要放在<dlentry>
与其关联的内部preceding-sibling::li[1]
。
所以想要的结果是这样的:
<refbody>
<dl>
<dlentry>
<dt>FOO</dt>
<dd>BAR
<p>Values: 000 - 999</p>
</dd>
</dlentry>
<dlentry>
<dt>FOO</dt>
<dd>BAR</dd>
</dlentry>
<dlentry>
<dt>FOO</dt>
<dd>BAR</dd>
</dlentry>
<dlentry>
<dt>FOO</dt>
<dd>BAR</dd>
</dlentry>
<dlentry>
<dt>FOO</dt>
<dd>BAR
<p>Values:</p>
<p>lorem ipsum</p>
<p>lorem ipsum</p>
<p>lorem ipsum</p>
</dd>
</dlentry>
</dl>
</refbody>
我想我需要使用密钥来执行此操作,但我无法让它正常工作。如果有人能告诉我我做错了什么,我将不胜感激。
这是我的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="kValues" match="p"
use="generate-id[preceding::li[1]]"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ul[ancestor::refbody][1]">
<dl>
<xsl:for-each select="child::li|following::li">
<xsl:variable name="vValues">
<xsl:value-of select="key('kValues',generate-id())"/>
</xsl:variable>
<dlentry>
<dt>
<xsl:value-of select="child::uicontrol"/>
</dt>
<dd>
<xsl:value-of select="text()"/>
<xsl:if test="$vValues">
<xsl:copy-of select="$vValues" />
</xsl:if>
</dd>
</dlentry>
</xsl:for-each>
</dl>
</xsl:template>
</xsl:stylesheet>