使用我的XSLT嵌套问题

时间:2012-09-18 14:26:44

标签: xml xslt xpath

尝试在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>并且在同一级别。有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

此:

  <xsl:template match="p[string-length(.) &gt; 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