Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/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
Xslt 将应用模板的结果与每个组的结果相结合(或问题的替代解决方案)_Xslt_Xslt 2.0 - Fatal编程技术网

Xslt 将应用模板的结果与每个组的结果相结合(或问题的替代解决方案)

Xslt 将应用模板的结果与每个组的结果相结合(或问题的替代解决方案),xslt,xslt-2.0,Xslt,Xslt 2.0,我得到了一个根据标题排序的文章列表。除了“主要”标题外,文章还可能有其他标题(甚至是多个)。当文章确实有其他标题时,文章应显示的次数应与有标题的次数相同(一篇文章有主标题和两个替代标题,在列表中应包含三个条目)。Simon Christian在这个论坛上发布了一个解决方案来克服这个问题(谢谢),我能够得到想要的列表 但是,我需要扩展这个解决方案。除了列表,我还需要一个跳转菜单。因此,我必须提取每个标题的第一个字母(包括备选标题),将这些字母显示在列表的顶部。每个字母都是指向页面上锚的链接。在列表

我得到了一个根据标题排序的文章列表。除了“主要”标题外,文章还可能有其他标题(甚至是多个)。当文章确实有其他标题时,文章应显示的次数应与有标题的次数相同(一篇文章有主标题和两个替代标题,在列表中应包含三个条目)。Simon Christian在这个论坛上发布了一个解决方案来克服这个问题(谢谢),我能够得到想要的列表

但是,我需要扩展这个解决方案。除了列表,我还需要一个跳转菜单。因此,我必须提取每个标题的第一个字母(包括备选标题),将这些字母显示在列表的顶部。每个字母都是指向页面上锚的链接。在列表中,首先显示字母“A”,然后是以“A”开头的所有文章,然后是以“B”开头的所有文章,依此类推。不应显示不是任何标题的第一个字母的字母

我有一个关于如何获取跳转菜单的旧解决方案,但它只在我必须从源XML中的一个位置提取标题时起作用。可供选择的标题比主标题更深一些。对于我使用的旧解决方案:

<div class="jumpmenu">
  <xsl:for-each-group group-by="substring(title, 1,1)" select="content">
    <xsl:sort order="ascending" select="substring(title, 1,1)"/>
    <a href="{$url}#{substring(title, 1,1)}"><xsl:value-of select="substring(title, 1,1)"/></a><xsl:text> </xsl:text>
  </xsl:for-each-group>
</div>
这个问题的解决方案可能会帮助我解决另一个问题,但如果有人对此有想法,我也会提出。具有替代标题的文章,与主标题的第一个字母列在同一个字母下。因此,鉴于上述exmaple,“BTitle 2”列在“C”下

很抱歉,这篇文章太长了,我没有找到任何方法使它变短,并且仍然精确。提前,谢谢

编辑:这是我到目前为止关于问题第二部分的代码:

<xsl:for-each-group group-by="substring(title, 1,1)" select="content">
  <xsl:sort order="ascending" select="substring(title, 1,1)"/>
  <xsl:apply-templates mode="overskrift" select="."/>
  <xsl:apply-templates select="current-group()/title|current-group()/contentdata/alternativetitles/alternativetitle">
    <xsl:sort select="string(.)"/>
  </xsl:apply-templates>
</xsl:for-each-group>


该代码将列出所有标题,但根据与文章主标题相同的第一个字母列出备选标题。

那么为什么不直接使用

<xsl:for-each-group select="content/title|content/contentdata/alternativetitles/alternativetitle" group-by="substring(., 1, 1)">
   <xsl:sort select="current-grouping-key()"/>
   <a href="{$url}#{current-grouping-key()}"><xsl:value-of select="current-grouping-key()"/></a><xsl:text> </xsl:text>

</xsl:for-each-group>


??您应该将该代码放在与该内容元素的父元素匹配的模板中(我不确定它的名称,因为您的路径表达式和发布的XML示例不匹配)。

那么您为什么不直接使用它呢

<xsl:for-each-group select="content/title|content/contentdata/alternativetitles/alternativetitle" group-by="substring(., 1, 1)">
   <xsl:sort select="current-grouping-key()"/>
   <a href="{$url}#{current-grouping-key()}"><xsl:value-of select="current-grouping-key()"/></a><xsl:text> </xsl:text>

</xsl:for-each-group>


??您应该将该代码放在与该内容元素的父元素匹配的模板中(我不确定它的名称,因为您的路径表达式和发布的XML示例不匹配)。

它似乎可以工作。谢谢!:)没有想到使用带“.”的group by,然后按当前分组键排序。。不错!我仍然很难找到解决问题第二部分的方法。你也能看一下吗?它似乎起作用了。谢谢!:)没有想到使用带“.”的group by,然后按当前分组键排序。。不错!我仍然很难找到解决问题第二部分的方法。你也能看一下吗?
<xsl:for-each-group group-by="substring(title, 1,1)" select="content">
  <xsl:sort order="ascending" select="substring(title, 1,1)"/>
  <xsl:apply-templates mode="overskrift" select="."/>
  <xsl:apply-templates select="current-group()/title|current-group()/contentdata/alternativetitles/alternativetitle">
    <xsl:sort select="string(.)"/>
  </xsl:apply-templates>
</xsl:for-each-group>
<xsl:for-each-group select="content/title|content/contentdata/alternativetitles/alternativetitle" group-by="substring(., 1, 1)">
   <xsl:sort select="current-grouping-key()"/>
   <a href="{$url}#{current-grouping-key()}"><xsl:value-of select="current-grouping-key()"/></a><xsl:text> </xsl:text>

</xsl:for-each-group>