xslt 1.0 - 将特定元素之前的节点转换为其他元素

时间:2011-01-10 17:51:01

标签: xslt xslt-1.0

我有以下输入:

<p>
    XYZZ
    <nl/>
    DEF
    <process>gggg</process>
    KKK
    <nl/>
    JKLK
    <nl/>
    QQQQ
</p>

我需要在元素<nl/>中输出由元素<title>分隔的每个节点:

<p>      
    <title>XYZZ</title>  
    <title>
        DEF<process>gggg</process>KKK  
    </title>  
    <title>JKLK</title>  
    <title>QQQQ</title>  
</p>

` 请告诉我获取指定输出的方法。

1 个答案:

答案 0 :(得分:0)

此转化

<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:key  name="kFollowing" match="/*/node()[not(self::nl)]"
  use="generate-id(preceding-sibling::nl[1])"/>

 <xsl:key  name="kPreceding" match="/*/node()[not(self::nl)]"
  use="generate-id(following-sibling::nl[1])"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="/*">
     <xsl:copy>
      <xsl:apply-templates select="@*|nl"/>
     </xsl:copy>
    </xsl:template>

    <xsl:template match="nl" name="groupFollowing">
      <title>
       <xsl:apply-templates select="key('kFollowing',generate-id())"/>
      </title>
    </xsl:template>

    <xsl:template match="nl[1]">
     <title>
       <xsl:apply-templates select="key('kPreceding',generate-id())"/>
     </title>
     <xsl:call-template name="groupFollowing"/>
    </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<p>
       XYZZ
       <nl/>
       DEF
       <process> gggg </process>
       KKK
       <nl/>
       JKLK
       <nl/>
       QQQQ
</p>

生成想要的正确结果

<p>
   <title>
       XYZZ
       </title>
   <title>
       DEF
       <process> gggg </process>
       KKK
       </title>
   <title>
       JKLK
       </title>
   <title>
       QQQQ
</title>
</p>

请注意

  1. 使用身份规则“按原样”复制节点。

  2. 有与顶部元素匹配的特定模板,顶部元素的第一个nl子元素和顶部元素的任何nl子元素。

  3. 定义了两个键,用于选择紧跟在nl元素之前的所有非nl节点以及紧跟{{1}的所有节点元素。

  4. nl元素替换为nl元素,并处理所有紧随其后的非title个节点,并将结果放入进入此nl元素。

  5. 对于第一个(其父级的子级)title元素,有一个初始步骤,其中添加了nl元素,并且所有紧接在前的非元素 - 处理title个节点,并将结果放入此nl元素中。然后执行上面步骤4中的处理。