XSLT 2.0中的子串和分组问题

时间:2011-05-24 19:34:57

标签: xslt

我有以下XML:

<InterSection criteria="Microsoft-ASP">value</Intersection>
<InterSection criteria="Microsoft-MVC">value</Intersection>
<InterSection criteria="HP-MVC">value</Intersection>

我需要在HTML页面的顶部创建TOC,因此我需要按标准分组(第一部分在' - '之前)。

我需要像

这样的不同值
  1. 微软
  2. HP
  3. 我的XSLT有以下代码

    <a>
        <xsl:attribute name="href">
          <xsl:text>#trigger</xsl:text>
          <xsl:value-of select="position()"/>
        </xsl:attribute>
                    <xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">
                          <xsl:value-of select="substring-before(@Criteria, ' - ')"/> 
                          <xsl:text>
                          </xsl:text>
                        </xsl:for-each-group>        
    
      </a>
    

    但不知怎的,我得到了

    1. 微软
    2. 微软
    3. HP
    4. 而不是 1.微软 2.惠普

      我在XSLT中写了以下内容

        <xsl:template match="InterSection" mode="TOC">
      
      <li>
        <a>
          <xsl:attribute name="href">
            <xsl:text>#trigger</xsl:text>
            <xsl:value-of select="position()"/>
          </xsl:attribute>
      
          <xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">
              <xsl:value-of select="current-grouping-key()"/>
              <xsl:for-each select="current-group()"/>
           </xsl:for-each-group>
        </a>
      </li>
      

2 个答案:

答案 0 :(得分:1)

我终于要总结一下我要在你的工作中解决的问题,以使其工作(删除以前的编辑):

  • 您输入的xml元素的大小写不正确
  • 在您的转换中,您使用错误的案例
  • 来引用属性criteria
  • 您的substring表达式在第二个参数-
  • 周围包含太多空格
  • 您应该使用current-grouping-key()来获取当前匹配组的值
  • 模板必须与InterSectionRoot)的父级匹配,然后您必须像InterSection
  • 一样迭代xsl:for-each

答案 1 :(得分:1)

           <xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">

这没有意义。 select属性中的表达式选择单个项。当选择了多个项目时,分组具有意义,我们希望使用特定条件对它们进行分组。

当单个项目“分组”时,“结果”始终是相同的项目 - 这正是您得到的。

解决方案:正确选择要分组的一组项目。或者,使用此替代解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vallKeys" select=
  "distinct-values
      (/*/*/@criteria
            /substring-before(.,'-')
      )
  "/>
 <xsl:template match="/">
  <xsl:for-each select="$vallKeys">
   <xsl:value-of select=
     "concat(position(),'.',.,'&#xA;')"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档(通过纠正其严重错误形式从提供的片段派生):

<someParent>
    <InterSection criteria="Microsoft-ASP">value</InterSection>
    <InterSection criteria="Microsoft-MVC">value</InterSection>
    <InterSection criteria="HP-MVC">value</InterSection>
</someParent>

产生了想要的正确结果

1.Microsoft
2.HP