使用键收集不同的值无法按预期工作
Collecting distinct values with key does not work as expected
我有以下 XML:
<planning>
<visit>
<nr>001</nr>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
</visit>
<visit>
<nr>002</nr>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CE03</code>
</action>
<action>
<code>CE03</code>
</action>
</visit>
</planning>
我希望为每次访问列出不同的代码。
我的 XSLT 是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="codekey" match="action" use="code"/>
<xsl:template match="/">
<visits>
<xsl:for-each select="/planning/visit">
<visit>
<nr><xsl:value-of select="nr"/></nr>
<codes>
<xsl:for-each select="action[generate-id()=generate-id(key('codekey',code)[1])]">
<xsl:value-of select="code"/>
<xsl:if test="not(position()=last())">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</codes>
</visit>
</xsl:for-each>
</visits>
</xsl:template>
</xsl:stylesheet>
然而,输出
<visits>
<visit>
<nr>001</nr>
<codes>CA01, CA02, CA03</codes>
</visit>
<visit>
<nr>002</nr>
<codes>CE03</codes>
</visit>
</visits>
我预计访问 002 的代码是 CA01, CA02, CA03, CE03
。
确实,当我转换时只访问 002:
<planning>
<visit>
<nr>002</nr>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CE03</code>
</action>
<action>
<code>CE03</code>
</action>
</visit>
</planning>
输出如我所料:
<visits>
<visit>
<nr>002</nr>
<codes>CA01, CA02, CA03, CE03</codes>
</visit>
</visits>
我应该怎么做才能得到我想要的结果?
使用 use="concat(../nr, '+', code)"
或 use="concat(generate-id(..), '+', code)"
作为键定义,当然,然后在使用键函数的地方使用相同的表达式,例如action[generate-id()=generate-id(key('codekey', concat(../nr, '+', code))[1])]
.
我有以下 XML:
<planning>
<visit>
<nr>001</nr>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
</visit>
<visit>
<nr>002</nr>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CE03</code>
</action>
<action>
<code>CE03</code>
</action>
</visit>
</planning>
我希望为每次访问列出不同的代码。 我的 XSLT 是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="codekey" match="action" use="code"/>
<xsl:template match="/">
<visits>
<xsl:for-each select="/planning/visit">
<visit>
<nr><xsl:value-of select="nr"/></nr>
<codes>
<xsl:for-each select="action[generate-id()=generate-id(key('codekey',code)[1])]">
<xsl:value-of select="code"/>
<xsl:if test="not(position()=last())">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</codes>
</visit>
</xsl:for-each>
</visits>
</xsl:template>
</xsl:stylesheet>
然而,输出
<visits>
<visit>
<nr>001</nr>
<codes>CA01, CA02, CA03</codes>
</visit>
<visit>
<nr>002</nr>
<codes>CE03</codes>
</visit>
</visits>
我预计访问 002 的代码是 CA01, CA02, CA03, CE03
。
确实,当我转换时只访问 002:
<planning>
<visit>
<nr>002</nr>
<action>
<code>CA01</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CA03</code>
</action>
<action>
<code>CA02</code>
</action>
<action>
<code>CE03</code>
</action>
<action>
<code>CE03</code>
</action>
</visit>
</planning>
输出如我所料:
<visits>
<visit>
<nr>002</nr>
<codes>CA01, CA02, CA03, CE03</codes>
</visit>
</visits>
我应该怎么做才能得到我想要的结果?
使用 use="concat(../nr, '+', code)"
或 use="concat(generate-id(..), '+', code)"
作为键定义,当然,然后在使用键函数的地方使用相同的表达式,例如action[generate-id()=generate-id(key('codekey', concat(../nr, '+', code))[1])]
.