尝试在XSLT 2.0中对转换进行编码。
我的源文档是什么样的(格式错误,但这正是我正在处理的):
<p>
<a>
WANT TO GRAB TEXT NODE HERE
<br/>
<br/>
<i> WORD </i>
DEFINITION TEXT NODE HERE
<br/>
<br/>
<i> WORD </i>
DEFINITION TEXT NODE HERE
</a>
</p>
我的目标是将其纳入我们当前定义列表的DTD标准,以便我的输出看起来像这样:
<p> WANT TO GRAB TEXT NODE HERE </p>
<dl>
<dlentry>
<dt><i> WORD </i></dt>
<dd> ANOTHER TEXT NODE HERE <dd>
<dt><i> WORD </i></dt>
<dd> ANOTHER TEXT NODE HERE <dd>
<dlentry>
<dl>
以下是我当前转化的代码段:
**<xsl:template match="a[descendant::i and descendant::br]/node()[1]">
<p>
<xsl:value-of select="." />
</p>
</xsl:template>**
<xsl:template match="p[string-length(.) gt 600]">
<dl>
<dlentry>
<xsl:apply-templates />
</dlentry>
</dl>
</xsl:template>
<xsl:template match="i">
<dt>
<i>
<xsl:value-of select="."/>
</i>
</dt>
</xsl:template>
<xsl:template match="text()[preceding-sibling::*[1][self::i]]">
<dd>
<xsl:value-of select="normalize-space()"/>
</dd>
</xsl:template>
我的变换的输出如下所示:
<dl>
<dlentry>
<p> WANT TO GRAB TEXT NODE HERE </p>
<dt><i> WORD </i></dt>
<dd> ANOTHER TEXT NODE HERE </dd>
<dt><i> WORD </i></dt>
<dd> ANOTHER TEXT NODE HERE </dd>
</dlentry>
</dl>
我希望<p>
高于<dl>
并且在同一级别。有什么想法吗?
提前致谢。
答案 0 :(得分:1)
此:
<xsl:template match="p[string-length(.) > 600]">
<p>
<xsl:value-of select="a/text()[1]"/>
</p>
<dl>
<dlentry>
<xsl:apply-templates select="a/node()[position()>1]"/>
</dlentry>
</dl>
</xsl:template>
<xsl:template match="i">
<dt>
<i>
<xsl:value-of select="."/>
</i>
</dt>
</xsl:template>
<xsl:template match="text()[preceding-sibling::*[1][self::i]]">
<dd>
<xsl:value-of select="normalize-space()"/>
</dd>
</xsl:template>
应该有效 - 它分别处理<a>
标记中的初始文本节点,然后将模板应用于其他节点(position()>1
)