尝试使用XSLT在我的XML中创建定义列表。
以下是我输入内容的说明:
<p>
<i>word1</i> definition text here <br />
<br />
<i>word1</i> definition text here <br />
<br />
<i>word1</i> definition text here <br />
<br />
<i>word1</i> definition text here <br />
<br />
<i>word1</i> definition text here <br />
</p>
上面的XML中的“定义文本”是我想要标记并包含在输出中的未标记文本节点。 我想要的输出的说明如下:
<dl>
<di>
<dt>word1</dt>
<dd>definition text here<dd>
<di>
<dl>
到目前为止,我的模板无效:
<xsl:template match="p">
<dl>
<dt>
<xsl:value-of select="./i/node()"/>
</dt>
<dd>
<xsl:sequence select="./text()" />
</dd>
</dl>
</xsl:template>
任何人都知道一种快速简便的方法吗?
提前致谢。
答案 0 :(得分:1)
您需要为输入中的每个di
发出一个i
元素,而不是为输入中的每个p
发出一个i
元素。首先,将代码移动到i
的模板。
在您的输入中,每个dd
后面紧跟一个文本节点,其中包含要标记为di
的文本。这必须嵌入i
元素中,因此需要在<xsl:template match='i'>
<di>
<dt><xsl:value-of select="."/></dt>
<dd><xsl:value-of select="following-sibling::text()[1]"/></dd>
</di>
</xsl:template>
<xsl:template match="p/text() | p/br"/>
的模板中处理,类似这样(未经测试):
dd
如果某些定义嵌入了标记,那么您需要一种更复杂的方法来填充{{1}}元素,但是当天就足够了。你要求快速简单的事情。
答案 1 :(得分:1)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="p">
<dl>
<di><xsl:apply-templates/></di>
</dl>
</xsl:template>
<xsl:template match="i">
<dt><xsl:value-of select="."/></dt>
</xsl:template>
<xsl:template match="text()[preceding-sibling::*[1][self::i]]">
<dd><xsl:value-of select="normalize-space()"/></dd>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档(严重格式错误 - 在此更正):
<p>
<i>word1</i> definition text here
<br />
<br />
<i>word2</i> definition text here
<br />
<br />
<i>word3</i> definition text here
<br />
<br />
<i>word4</i> definition text here
<br />
<br />
<i>word5</i> definition text here
<br />
</p>
生成想要的正确结果:
<dl>
<di>
<dt>word1</dt>
<dd>definition text here</dd>
<dt>word2</dt>
<dd>definition text here</dd>
<dt>word3</dt>
<dd>definition text here</dd>
<dt>word4</dt>
<dd>definition text here</dd>
<dt>word5</dt>
<dd>definition text here</dd>
</di>
</dl>
,它在浏览器中显示为: