Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT1.0-将特定元素之前的节点转换为其他元素_Xslt_Xslt 1.0 - Fatal编程技术网

XSLT1.0-将特定元素之前的节点转换为其他元素

XSLT1.0-将特定元素之前的节点转换为其他元素,xslt,xslt-1.0,Xslt,Xslt 1.0,我有以下意见: <p> XYZZ <nl/> DEF <process>gggg</process> KKK <nl/> JKLK <nl/> QQQQ </p> 我需要按元素划分的每个节点在元素中输出: ` 请告诉我获取指定输出的方法。此转换: 应用于提供的XML文档时: 生成所需的正确结果: 请注意: 标识规则用于按原样复制节点 存在与

我有以下意见:

<p>
    XYZZ
    <nl/>
    DEF
    <process>gggg</process>
    KKK
    <nl/>
    JKLK
    <nl/>
    QQQQ
</p>
我需要按元素划分的每个节点在元素中输出:

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

此转换:

应用于提供的XML文档时:

生成所需的正确结果:

请注意:

标识规则用于按原样复制节点

存在与top元素、top元素的第一个nl子元素和top元素的任何nl子元素匹配的特定模板

定义了两个键,用于选择nl元素前面的所有非nl节点和nl元素后面的所有节点

nl元素被title元素替换,紧跟其后的所有非nl节点都被处理,结果被放入该title元素

对于其父nl元素的第一个子元素,有一个初始步骤,在该步骤中添加一个title元素,并处理前面所有的非nl节点,然后将结果放入该title元素。然后执行步骤4中的处理。执行上述步骤


好问题,+1。请参阅我的答案,以获得一个完整且简短的、也是最有效的解决方案。我已仔细解释了此解决方案中的所有步骤:非常感谢,Dimitre.:这对我很有效。这也让我清楚了使用key,generate ID函数的概念-+回答得好。您还可以为第一个组使用一个键和一个空键值。但这更清楚,更真实。
<p>      
    <title>XYZZ</title>  
    <title>
        DEF<process>gggg</process>KKK  
    </title>  
    <title>JKLK</title>  
    <title>QQQQ</title>  
</p>
<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>
<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>