如何从循环中生成唯一 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
您有几个问题,其中:
你有一个从未被调用的命名模板 - 显然没有其他模板被应用;
您对 Muenchian 分组 的实施不正确;
您在需要相对当前节点后代路径的地方使用//
; //
总是从根开始;
XML 区分大小写:operatordesc2
不 select 名为 Operatordesc2
;
[=58= 的节点]
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> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例(关闭 schedules
标签后!),结果将是:
Row value1|valuedesc|valuedesc2
Row value2|valuedesc2|valuedesc3
注意OperatorDesc
和Operatordesc2
的值仅来自第一个记录组 .
我有两个元素,我必须在使用键循环时从中选择一个唯一元素,但我得到的是空而不是一个。请看下面
<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
您有几个问题,其中:
你有一个从未被调用的命名模板 - 显然没有其他模板被应用;
您对 Muenchian 分组 的实施不正确;
您在需要相对当前节点后代路径的地方使用
//
;//
总是从根开始;XML 区分大小写:
[=58= 的节点]operatordesc2
不 select 名为Operatordesc2
;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> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例(关闭 schedules
标签后!),结果将是:
Row value1|valuedesc|valuedesc2
Row value2|valuedesc2|valuedesc3
注意OperatorDesc
和Operatordesc2
的值仅来自第一个记录组 .