定义列表创建

时间:2012-09-14 22:00:01

标签: xml xslt

尝试使用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>

任何人都知道一种快速简便的方法吗?

提前致谢。

2 个答案:

答案 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>

,它在浏览器中显示为

          
WORD1
      
定义文本
      
WORD2
      
定义文本
      
WORD3
      
定义文本
      
word4
      
定义文本
      
的word5
      
定义文本