正確な出力を得るには助けが必要です。次の入力 xml について、Sean B. Durkin によって提供されたコードの助けを借りて、xml に取り組みました。必要な出力を取得するようにコードを変更しましたが、ACCURATE OUTPUTの取得に問題があります。コードのどこが間違っているのか教えてください。デバッグすると、「indoor」の値が「game_no」123 および「group」1 で認識されていないことがわかりました。
入力 XML ファイル:
<?xml version="1.0" encoding="UTF-8"?>
<t>
<Games>
<Game_no>123</Game_no>
<Group>1</Group>
<Name>game.outdoor</Name>
<Value>Golf</Value>
</Games>
<Games>
<Game_no>123</Game_no>
<Group>1</Group>
<Name>game.indoor</Name>
<Value>Chess</Value>
</Games>
<Games>
<Game_no>223</Game_no>
<Group>1</Group>
<Name>games.outdoor</Name>
<Value>Soccer</Value>
</Games>
<Games>
<Game_no>223</Game_no>
<Group>2</Group>
<Name>games.indoor</Name>
<Value>Golf</Value>
</Games>
<Games>
<Game_no>223</Game_no>
<Group>1</Group>
<Name>games.outdoor</Name>
<Value>Batminton</Value>
</Games>
<Games>
<Game_no>123</Game_no>
<Group>1</Group>
<Name>ga.outdoor</Name>
<Value>tennis</Value>
</Games>
<Games>
<Game_no>123</Game_no>
<Group>1</Group>
<Name>today</Name>
<Value>value returning with no'.'</Value>
</Games>
<Games>
<Game_no>123</Game_no>
<Group>1</Group>
<Name>indoor</Name>
<Value>value returning with same Group 123 and game_no 1</Value>
</Games>
<Games>
<Game_no>123</Game_no>
<Group>2</Group>
<Name>outdoor</Name>
<Value>value returning with different Group 2</Value>
</Games>
<Games>
<Game_no>323</Game_no>
<Group>2</Group>
<Name>outdoor</Name>
<Value>value returning with different Game_no 323</Value>
</Games>
</t>
上記の入力 XML には要素 "Games" があり、次のノードに同じ値 "Game_no" & "Group" がある場合、"." のときに要素 "Name" に対して目的の出力を作成できます。ある。しかし、「Game_no」と「Group」の各ノードに同じ値がある場合、「.」なしで出力を達成できませんでした。要素「名前」で。目的の出力と取得している出力を配置します。コードと共に。 なぜ私がそれを達成できないのか助けが必要です。
意図した出力に従って変更した XSL ファイル コード:
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:key name="gamekey" match="Games" use="Game_no"/>
<xsl:key name="game-group" match="Games" use="concat(substring-before(Name,'.'),'|',Game_no,'|',Group)"/>
<xsl:template match="/">
<Holiday>
<xsl:for-each select="//t/Games[generate-id(.) = generate-id(key('gamekey', Game_no)[1])] ">
<Weekend>
<xsl:variable name="var1" select="Game_no"/>
<xsl:apply-templates select="//t/Games[generate-id(.) = generate-id( key('game-group', concat( substring-before(Name ,'.'),'|',$var1,'|',Group))[1])] [substring-before(Name ,'.')or not(Name/*)] "/>
<xsl:apply-templates select="key('game-group','||')/self::Games"/>
</Weekend>
</xsl:for-each>
</Holiday>
</xsl:template>
<xsl:template match="Games [ substring-before(Name,'.') != '']">
<xsl:element name="{substring-before(Name,'.')}">
<xsl:for-each select="key('game-group', concat( substring-before(Name,'.'),'|',Game_no,'|',Group))">
<xsl:element name="{substring-after(Name,'.')}">
<xsl:value-of select="Value"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:template match="Games [ substring-before(Name,'.') = '']">
<xsl:element name="{Name}">
<xsl:value-of select="Value"/>
</xsl:element>
</xsl:template>
私が得ている出力:
<?xml version="1.0" encoding="UTF-8"?>
<Holiday>
<Weekend>
<game>
<outdoor>Golf</outdoor>
<indoor>Chess</indoor>
</game>
<ga>
<outdoor>tennis</outdoor>
</ga>
<today>value returning with no'.'</today>
<outdoor>value returning with different Group 2</outdoor>
</Weekend>
<Weekend>
<games>
<outdoor>Soccer</outdoor>
<outdoor>Batminton</outdoor>
</games>
<games>
<indoor>Golf</indoor>
</games>
</Weekend>
<Weekend>
<outdoor>value returning with different Game_no 323</outdoor>
</Weekend>
</Holiday>
希望する出力:
<?xml version="1.0" encoding="UTF-8"?>
<Holiday>
<Weekend>
<game>
<outdoor>Golf</outdoor>
<indoor>Chess</indoor>
</game>
<ga>
<outdoor>tennis</outdoor>
</ga>
<today>value returning with no'.'</today>
<indoor>value returning with same Group 123 and game_no 1</indoor>
<outdoor>value returning with different Group 2</outdoor>
</Weekend>
<Weekend>
<games>
<outdoor>Soccer</outdoor>
<outdoor>Batminton</outdoor>
</games>
<games>
<indoor>Golf</indoor>
</games>
</Weekend>
<Weekend>
<outdoor>value returning with different Game_no 323</outdoor>
</Weekend>
</Holiday>
注: 質問は似ていますが、私はあらゆる方法で内部ループを変更しようとしている学習者です。助けていただければ幸いです。ノードの 1 つが削除されている理由を知ることができれば幸いです。