0

在查看了来自社区的大量很棒的建议后,第一次在这里发帖。

我在 XSLT 2.0 中有三个字段,都在同一级别(肩膀、膝盖和脚趾)。我需要根据肩膀和膝盖的独特组合输出脚趾的总和,所以我为每个组创建了两个嵌套的。在每个输出上,我还需要输出一个从 1 到肩膀和膝盖独特组合数量的增量器。

这个增量器是我遇到问题的地方。我最接近的是调用 position(),但如果我在最里面的组中调用它,计数器会在每个唯一的肩部重置。如果我在最外面的组中调用它,一个独特的肩膀内的每个膝盖都得到相同的值,然后它在每个独特的肩膀处重置。如果我完全在组之外调用它,它永远不会超过 1。我也尝试使用 xsl:number 、键等,但无济于事。在这些情况下,仍在打印正确的行数,但增量值正在查看单个的非分组值。

我读了一个关于模板之间“隧道”值的建议,但我无法让它工作,主要是因为我认为我没有正确调用模板(这些字段是同一级别而不是父级-孩子)。关于使这项工作与每个组或其他方式一起工作有什么想法吗?提前谢谢了。

示例 XML:

<bodies>
<parts>
    <shoulders>shoulders1</shoulders>
    <knees>knees1</knees>
    <toes>1</toes>
</parts>
<parts>
    <shoulders>shoulders2</shoulders>
    <knees>knees2</knees>
    <toes>2</toes>
</parts>
<parts>
    <shoulders>shoulders1</shoulders>
    <knees>knees2</knees>
    <toes>10</toes>
</parts>
<parts>
    <shoulders>shoulders2</shoulders>
    <knees>knees1</knees>
    <toes>10</toes>
</parts>
<parts>
    <shoulders>shoulders1</shoulders>
    <knees>knees1</knees>
    <toes>9</toes>
</parts>
<parts>
    <shoulders>shoulders2</shoulders>
    <knees>knees2</knees>
    <toes>8</toes>
</parts>
</bodies>

示例 XSLT:

<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsl:template match="/">
      <xsl:for-each-group select="bodies/parts" group-by="shoulders">
         <xsl:for-each-group select="current-group()" group-by="knees">
            <xsl:value-of select="shoulders"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="knees"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="sum(current-group()/toes)"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="position()"/>
            <xsl:text>. </xsl:text> 
         </xsl:for-each-group>
      </xsl:for-each-group>
   </xsl:template>
</xsl:stylesheet>

结果输出:

肩膀1, 膝盖1, 10, 1. 肩膀1, 膝盖2, 10, 2. 肩膀2, 膝盖2, 10, 1. 肩膀2, 膝盖1, 10, 2.

期望的输出:

肩膀1, 膝盖1, 10, 1. 肩膀1, 膝盖2, 10, 2. 肩膀2, 膝盖2, 10, 3. 肩膀2, 膝盖1, 10, 4.

4

2 回答 2

1

当您有两个xsl:for-each-group这样的嵌套指令时,另一种方法是对复合键进行单级分组,如下所示:

<xsl:for-each-group select="bodies/parts" group-by="concat(shoulders, '~', knees)">

position()如果我正确理解了要求,那么将增加您正在寻找的方式。

当然,如果您确实想要生成外部组很重要的分层结构输出,那么这不起作用。

于 2013-10-08T06:47:35.423 回答
0

我现在已经尝试了 3 次,我认为你必须处理你的结果,然后计算它们。我已经没有时间尝试找出一种方法来进行内联计数,因为我认为它无法完成。

<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsl:template match="/">
     <xsl:variable name="results" as="xsd:string*">
      <xsl:for-each-group select="bodies/parts" group-by="shoulders">
         <xsl:for-each-group select="current-group()" group-by="knees">
           <xsl:value-of>
            <xsl:value-of select="shoulders"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="knees"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="sum(current-group()/toes)"/>
            <xsl:text>,</xsl:text>
           </xsl:value-of>
         </xsl:for-each-group>
      </xsl:for-each-group>
     </xsl:variable>
     <xsl:for-each select="$results">
        <xsl:value-of select=".,position()"/>
        <xsl:text>. </xsl:text>
     </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>
于 2013-10-08T02:52:22.790 回答