Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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
通过转换动态分组XSLT节点_Xslt_Transform_Foreach - Fatal编程技术网

通过转换动态分组XSLT节点

通过转换动态分组XSLT节点,xslt,transform,foreach,Xslt,Transform,Foreach,我试图通过XSLT转换创建这样的页面 页数 第1页 第2页 链接 链接1 链接2 这是xml <siteMenu> <Pages> <title>page1</title> </Pages> <Pages> <title>page2</title> </Pages> <Links> <title>link1<

我试图通过XSLT转换创建这样的页面

页数

  • 第1页
  • 第2页
链接

  • 链接1
  • 链接2
这是xml

<siteMenu>
  <Pages>
    <title>page1</title>
  </Pages>
  <Pages>
    <title>page2</title>
  </Pages>
  <Links>
    <title>link1</title>
  </Links>
  <Links>
    <title>link2</title>
  </Links>
</siteMenu>

第1页
第2页
链接1
链接2
我试着用

<xsl:for-each select="*"> and <xsl:for-each-group select="*" group-by="@v">
但是这给了我每个元素,但是我如何根据父节点将它们分离出来呢


我还希望使其动态化,这样,如果我在siteMenu中添加另一项,它将适当地更新xslt

您正在
选择
所有内容(
*

使用
select=“Pages”
选择页面,使用
select=“Links”
选择链接


了解XPath表达式。

您正在
选择
所有内容(
*

使用
select=“Pages”
选择页面,使用
select=“Links”
选择链接

了解XPath表达式。

我将从

<ul>
  <xsl:for-each select="//Pages">
    <li><xsl:value-of select="./title"/></li>
  </xsl:for-each>
</ul>
然后从那里继续。

我将从

<ul>
  <xsl:for-each select="//Pages">
    <li><xsl:value-of select="./title"/></li>
  </xsl:for-each>
</ul>

然后从那里继续。

所以您希望按节点名称分组。在XML节点中存储比实际结构信息更多的信息并不是最好的主意,但您可以这样做:

<siteMenu>
  <Pages>
    <title>page1</title>
  </Pages>
  <Pages>
    <title>page2</title>
  </Pages>
  <Links>
    <title>link1</title>
  </Links>
  <Links>
    <title>link2</title>
  </Links>
  <Sites>
    <title>site1</title>
  </Sites>
  <Sites>
    <title>site2</title>
  </Sites>
</siteMenu>

第1页
第2页
链接1
链接2
地点1
站点2
此XSLT 2.0转换(仅限相关片段):


或此XSLT 1.0转换(仅限相关片段):


提示:您可能需要考虑使用这样的XML,这显然更符合您的站点结构,并且您不需要分组来正确输出它

<siteMenu>
  <section name="Pages">
    <title>page1</title>
    <title>page2</title>
  </section>
  <section name="Links">
    <title>link1</title>
    <title>link2</title>
  </section>
  <section name="Sites">
    <title>site1</title>
    <title>site2</title>
  </section>
</siteMenu>

第1页
第2页
链接1
链接2
地点1
站点2

因此您希望按节点名称分组。在XML节点中存储比实际结构信息更多的信息并不是最好的主意,但您可以这样做:

<siteMenu>
  <Pages>
    <title>page1</title>
  </Pages>
  <Pages>
    <title>page2</title>
  </Pages>
  <Links>
    <title>link1</title>
  </Links>
  <Links>
    <title>link2</title>
  </Links>
  <Sites>
    <title>site1</title>
  </Sites>
  <Sites>
    <title>site2</title>
  </Sites>
</siteMenu>

第1页
第2页
链接1
链接2
地点1
站点2
此XSLT 2.0转换(仅限相关片段):


或此XSLT 1.0转换(仅限相关片段):


提示:您可能需要考虑使用这样的XML,这显然更符合您的站点结构,并且您不需要分组来正确输出它

<siteMenu>
  <section name="Pages">
    <title>page1</title>
    <title>page2</title>
  </section>
  <section name="Links">
    <title>link1</title>
    <title>link2</title>
  </section>
  <section name="Sites">
    <title>site1</title>
    <title>site2</title>
  </section>
</siteMenu>

第1页
第2页
链接1
链接2
地点1
站点2

问题是我想让它变得动态。这样我就可以添加另一个名为“站点”的节点,它会将其添加到菜单中。问题是我想让它成为动态的。因此,我可以添加另一个名为“站点”的节点,它会将其添加到菜单中。请参阅我对Oded的回复,了解如何使其成为动态的。请参阅我对Oded的回复,了解如何使其成为动态的。这将适用于XSLT 2.0,但不适用于1.0。那我就得另找一条路了。@scott:但你自己在问题中对每个组都使用了
,没有留下任何迹象表明你在使用XSLT 1.0。我只是假设您使用的是2.0…将添加XSLT1.0解决方案。我找到了一个理想的解决方案。工作得很好。@scott:这个答案所做的是Muenchian分组。这适用于XSLT2.0,但不适用于1.0。那我就得另找一条路了。@scott:但你自己在问题中对每个组都使用了
,没有留下任何迹象表明你在使用XSLT 1.0。我只是假设您使用的是2.0…将添加XSLT1.0解决方案。我找到了一个理想的解决方案。斯考特:这个答案的作用是明钦分组。