Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.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/0/xml/13.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
Html 如何包装<;h2>;及<;p>;a中的标签<;第节>;xslt中的标记?_Html_Xml_Xslt - Fatal编程技术网

Html 如何包装<;h2>;及<;p>;a中的标签<;第节>;xslt中的标记?

Html 如何包装<;h2>;及<;p>;a中的标签<;第节>;xslt中的标记?,html,xml,xslt,Html,Xml,Xslt,我想将标题和段落包装在节标记中。节标记在下一个标题出现时结束 输入: <body> <h2>text text</h2> <p> some text </p> <p> some text </p> <h2> text text </h2> <p> some text </p> <p> some text &

我想将标题和段落包装在节标记中。节标记在下一个标题出现时结束

输入:

<body>
    <h2>text text</h2>
    <p> some text </p>
    <p> some text </p>
    <h2> text text </h2>
    <p> some text </p>
    <p> some text </p>
    <p> some text </p>
</body>

文本
一些文本

一些文本

文本 一些文本

一些文本

一些文本

输出:

 <body>
    <section>
        <h2>text text</h2>
        <p> some text </p>
        <p> some text </p>
    </section>
    <section>
        <h2> text text </h2>
        <p> some text </p>
        <p> some text </p>
        <p> some text </p>
    </section>
</body>

文本
一些文本

一些文本

文本 一些文本

一些文本

一些文本


如评论中所述,这是一个分组问题

如果您使用的是XSLT2.0,那么可以使用
xsl:for each group/@group,以
开头

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/body">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:for-each-group select="*" group-starting-with="h2">
        <section>
          <xsl:copy-of select="current-group()"/>
        </section>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

这两个样式表产生相同的输出。

您是否只需要处理每个
h2
p
标记,或者是否还需要处理其他标记(例如
h3
p
以外的“节”内容)?是的,在h2标记下面可以有其他标记。但该节必须从h2标记开始,在下一个h2标记之前结束。这是一个分组问题。XSLT1.0或2.0的答案是不同的。无论如何,进行搜索-这可能是这里最常问的问题。中以
示例开头的每个组的
,应该可以让您了解是否可以使用XSLT 2.0处理器。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="sectElems" match="/body/*[not(self::h2)]" 
    use="generate-id(preceding-sibling::h2[1])"/>

  <xsl:template match="/body">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="h2"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="h2">
    <xsl:variable name="id">
      <xsl:value-of select="generate-id()"/>
    </xsl:variable>
    <section>
      <xsl:copy-of select=".|key('sectElems',$id)"/>
    </section>
  </xsl:template>

</xsl:stylesheet>