如何从循环中生成唯一的id

时间:2016-07-08 16:19:40

标签: xml xslt key uniqueidentifier

我有两个元素,我必须选择一个独特的东西,然后使用键循环,但我变得空,而不是一个。请看下面的

 <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 个答案:

答案 0 :(得分:1)

你有几个问题,其中包括:

  1. 您有一个永远不会被调用的命名模板 - 显然没有应用的其他模板;

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

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

  4. XML区分大小写:operatordesc2未选择名为Operatordesc2的节点;

  5. Operatorvalue元素,而不是属性 - 因此@Operatorvalue不会选择任何内容。

  6. 以此为出发点:

    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的值仅从第一条记录