Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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/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
Xml XSLT使用递归复制节点_Xml_Xslt - Fatal编程技术网

Xml XSLT使用递归复制节点

Xml XSLT使用递归复制节点,xml,xslt,Xml,Xslt,我是XSLT新手,我有以下结构的XML文件: <A> <label> <c>Tag number 1</c> </label> <row> <c>Tag Number 2</c> </row> <label> <c>Tag number 3</c> </label> </A> 因此

我是XSLT新手,我有以下结构的XML文件:

<A>
  <label>
    <c>Tag number 1</c>
  </label>
  <row>
    <c>Tag Number 2</c>
  </row>
  <label>
    <c>Tag number 3</c>
  </label>
</A>
因此,我想要的是根据
label
标记来分离
A
标记,换句话说,复制
label
标记和所有后续标记,直到第二个
label
标记被分离到另一个
A
标记和所有后续标记,依此类推

我希望我描述得很清楚,并原谅我的问题


提前感谢

请考虑使用键按非标签元素最前面的
标签
元素查找非标签元素

<xsl:key name="label" match="*[not(self::label)]" use="generate-id(preceding-sibling::label[1])" />
然后,在匹配
label
的模板中,可以使用Then键获得所有相关元素

<xsl:apply-templates select="key('label', generate-id())"/>

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="label" match="*[not(self::label)]" use="generate-id(preceding-sibling::label[1])" />

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

   <xsl:template match="A">
      <xsl:apply-templates select="label" />
   </xsl:template>

   <xsl:template match="label">
      <A>
         <xsl:call-template name="identity" />
         <xsl:apply-templates select="key('label', generate-id())"/>
      </A>
   </xsl:template>
 </xsl:stylesheet>


注意:我正在使用标识模板复制文档中的所有现有节点。

如果您使用的是XSLT 2.0,那么使用
@michael.hor257k应该很简单。很抱歉,michael,我想使用XSLT 1.0
<xsl:apply-templates select="key('label', generate-id())"/>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="label" match="*[not(self::label)]" use="generate-id(preceding-sibling::label[1])" />

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

   <xsl:template match="A">
      <xsl:apply-templates select="label" />
   </xsl:template>

   <xsl:template match="label">
      <A>
         <xsl:call-template name="identity" />
         <xsl:apply-templates select="key('label', generate-id())"/>
      </A>
   </xsl:template>
 </xsl:stylesheet>