次のような 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>
要素を 1 つの .xmlに統合すること<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>