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

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_Xslt 2.0 - Fatal编程技术网

Xml XSLT-分析给定节点的以下同级

Xml XSLT-分析给定节点的以下同级,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个xml,如下所示 <doc> <h1>header 1</h1> <p>para</p> <p>para</p> <h1>header 2</h1> <p>para</p> <h2>header 2 sub h1</h2> <h2>header 2 sub

我有一个xml,如下所示

    <doc>
    <h1>header 1</h1>
    <p>para</p>
    <p>para</p>

    <h1>header 2</h1>
    <p>para</p>
    <h2>header 2 sub h1</h2>
    <h2>header 2 sub h2</h2>

    <h1>header 3</h1>
    <p>para</p>
    <p>para</p>

    <h1>header 4</h1>
    <h2>header 4 sub h1</h2>
    <p>para</p> 

</doc>

标题1
帕拉

帕拉

标题2 帕拉

标题2子标题h1 标题2子标题h2 标题3 帕拉

帕拉

标题4 标题4子标题h1 第

我需要的是有序地获取所有
节点,并创建一个无序列表

所以最终的输出应该是这样的

    <doc>
        <ul>
            <li><h1>header 1</h1><li>

            <li><h1>header 2</h1></li>
            <ul> 
              <li><h2>header 2 sub h1</h2></li>
              <li><h2>header 2 sub h2</h2><li>
            </ul>

            <li><h1>header 3</h1></li>

            <li><h1>header 4 sub h1</h1></li>
            <ul>
              <li><h2>zz</h2></li>
            </ul>
       </ul>
  </doc>

  • 标题1
  • 标题2
    • 标题2子标题h1
    • 标题2子项h2
  • 标题3
  • 标题4子标题h1
    • zz
我编写的xsl如下所示

<xsl:template match="doc">
        <doc>
            <xsl:for-each select="//h1">
                <li>
                    <xsl:apply-templates/>
                </li>
                <ul>
                    <xsl:for-each-group select="//h2" group-by="count(preceding::h1)">
                        <li><xsl:apply-templates/></li>
                    </xsl:for-each-group>
                </ul>
            </xsl:for-each>
        </doc>
    </xsl:template>
<doc>
    <li>header 1</li>
    <ul><li>header 2 sub h1header 4 sub h1</li></ul>
    <li>header 2</li>
    <ul></li>header 2 sub h1header 4 sub h1</li></ul>
    <li>header 3</li>
    <ul></li>header 2 sub h1header 4 sub h1</li></ul>
    <li>header 4</li>
    <ul></li>header 2 sub h1header 4 sub h1</li></ul>
</doc>

    结果如下:

    <xsl:template match="doc">
            <doc>
                <xsl:for-each select="//h1">
                    <li>
                        <xsl:apply-templates/>
                    </li>
                    <ul>
                        <xsl:for-each-group select="//h2" group-by="count(preceding::h1)">
                            <li><xsl:apply-templates/></li>
                        </xsl:for-each-group>
                    </ul>
                </xsl:for-each>
            </doc>
        </xsl:template>
    
    <doc>
        <li>header 1</li>
        <ul><li>header 2 sub h1header 4 sub h1</li></ul>
        <li>header 2</li>
        <ul></li>header 2 sub h1header 4 sub h1</li></ul>
        <li>header 3</li>
        <ul></li>header 2 sub h1header 4 sub h1</li></ul>
        <li>header 4</li>
        <ul></li>header 2 sub h1header 4 sub h1</li></ul>
    </doc>
    
    
    
  • 标题1
    • 标题2子标题h1标题4子标题h1
      • 标题2
        • 标题2子标题h1标题4子标题h1
      • 标题3
        • 标题2子标题h1标题4子标题h1
      • 标题4
        • 标题2子标题h1标题4子标题h1
    如您所见,我在每次摸索中都会在相关的
    节点下添加
    节点。(这是我可以想到的在其相关的
    节点下添加
    节点的解决方案。)但是,正如您所看到的,它没有给出预期的输出


    你能建议一种方法我如何改变我的代码以获得预期的结果吗。或者可能是获得预期结果的另一种方法?

    您希望此组从开始

    <xsl:template match="doc">
      <ul>
        <xsl:for-each-group select="*" group-starting-with="h1">
          <li><xsl:copy-of select="."/></li>
          <ul>
           <xsl:apply-templates select="current-group()[self::h2]"/>
          </ul>
        </xsl:for-each-group>
      </ul>
    </xsl:template>
    
    
    

    你真的想要这个输出吗?在HTML中,
    元素的所有子元素必须是
  • 元素。然而,就XSLT而言,您应该能够适应这种方法。

    这在+1时非常有效。此代码中的html可能错误。我只是想解释一下这个问题。谢谢你的回答。:)