如何从循环中生成唯一 ID

How to generate unique id from the loop

我有两个元素,我必须在使用键循环时从中选择一个唯一元素,但我得到的是空而不是一个。请看下面

 <xsl:key name="Keyunique"  match="//schedules/test/Operatorvalue" use="//schedules/test/Operatorvalue/@Operatorvalue" />



<xsl:template name="Buildairline">        
        <xsl:for-each select="//schedules/test">    
          <xsl:for-each select="key('Keyunique', //schedules/test/Operatorvalue/@Operatorvalue)[1]">                
            <Row Action="ADD">
              <xsl:value-of select="current()/Operatorvalue" />|<xsl:value-of select="current()/OperatorDesc" />|test|<xsl:value-of  select="current()/operatordesc2" />
            </Row>              
        </xsl:for-each>
        </xsl:for-each>
      </Rows>       
  </xsl:template>

下面是xml

<schedules>
<test>
<Operatorvalue>value1</Operatorvalue>
<OperatorDesc>valuedesc</OperatorDesc>
<OperatorDesc2>valuedesc2</OperatorDesc2>
</test>
<test>
<Operatorvalue>value1</Operatorvalue>
<OperatorDesc>valuedesc</OperatorDesc>
<OperatorDesc2>valuedesc2</OperatorDesc2>
</test>
<test>
<Operatorvalue>value2</Operatorvalue>
<OperatorDesc>valuedesc2</OperatorDesc>
<OperatorDesc2>valuedesc3</OperatorDesc2>
</test>
<schedules>

预期输出

Row value1|valuedesc|valuedesc2
Row value2|valuedesc2|valuedesc3

您有几个问题,其中:

  1. 你有一个从未被调用的命名模板 - 显然没有其他模板被应用;

  2. 您对 Muenchian 分组 的实施不正确;

  3. 您在需要相对当前节点后代路径的地方使用//// 总是从根开始;

  4. XML 区分大小写:operatordesc2 不 select 名为 Operatordesc2;

    [=58= 的节点]
  5. Operatorvalue 是一个 元素 ,而不是 属性 - 所以 @Operatorvalue 将没有 select 任何东西。

试试这个作为你的起点:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name="Keyunique" match="test" use="Operatorvalue"/>

<xsl:template match="/schedules">    
    <xsl:for-each select="test[generate-id()=generate-id(key('Keyunique', Operatorvalue)[1])]">     
        <xsl:text>Row </xsl:text>
        <xsl:value-of select="Operatorvalue" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="OperatorDesc" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="OperatorDesc2" />
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例(关闭 schedules 标签后!),结果将是:

Row value1|valuedesc|valuedesc2
Row value2|valuedesc2|valuedesc3

注意OperatorDescOperatordesc2的值来自第一个记录组 .