いくつかの変数に基づいてノードを選択したいと思います。XMLコード:
<data>
<prot seq="AAA">
<node num="1">1345</node>
<node num="1">11245</node>
<node num="2">88885</node>
</prot>
<prot seq="BBB">
<node num="1">678</node>
<node num="1">456</node>
<node num="2">6666</node>
</prot>
<prot seq="CCC">
<node num="1">111</node>
<node num="1">222</node>
<node num="2">333</node>
</prot>
</data>
欲しいXML
<output>
<prot seq="AAA">
<node num="1">1345</node>
<node num="2">88885</node>
</prot>
<prot seq="BBB">
<node num="1">678</node>
<node num="2">6666</node>
</prot>
<prot seq="CCC">
<node num="1">111</node>
<node num="2">333</node>
</prot>
</data>
したがって、私の考えは、ノードをxsl:key要素でグループ化し、次にfor-eachを実行することでした。例えば:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="by" match="/data/prot" use="concat(@seq,'|',node/@num)"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="/data/prot"/>
</root>
</xsl:template>
<xsl:template match="/data/prot">
<xsl:for-each select="./node">
<xsl:for-each select="key('by',concat(current()/../@seq,'|',current()/@num))">
node <xsl:value-of select="./node" />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
しかし、出力は私が期待したものではなく、私が間違っていることを見ることができません。for-each構造を維持したいと思います。これは、xsl:keyグループ化機能を適切に使用していなかったかのようです。
私が得る出力、不要
<root>
node 1345
node 1345
node 678
node 678
node 111
node 111</root>
そして、テストされるコード http://www.xsltcake.com/slices/sgWUFu/20
ありがとう!