我有两个元素,我必须选择一个独特的东西,然后使用键循环,但我变得空,而不是一个。请看下面的
<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
答案 0 :(得分:1)
你有几个问题,其中包括:
您有一个永远不会被调用的命名模板 - 显然没有应用的其他模板;
Muenchian分组的实施不正确;
您在需要相对路径到当前节点后代的地方使用//
; //
总是从根开始;
XML区分大小写:operatordesc2
未选择名为Operatordesc2
的节点;
Operatorvalue
是元素,而不是属性 - 因此@Operatorvalue
不会选择任何内容。
以此为出发点:
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
的值仅从第一条记录 。