0

正確な出力を得るには助けが必要です。次の入力 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 つが削除されている理由を知ることができれば幸いです。

4

1 に答える 1

0

これが私の質問の更新です。

これで、目的の出力を取得できました。「。」なしにループする場合。「Game_no」と「Group」の値は同じです。これがコードです。

<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:key name="gamekey2" use="concat(Game_no,'|',Group)" match="Games"/>
<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:for-each select="key('gamekey2', concat( Game_no,'|',Group))">
<xsl:if test="not(contains(Name,'.'))">
    <xsl:element name="{Name}">
        <xsl:value-of select="Value"/>
    </xsl:element>
    </xsl:if>
    </xsl:for-each>
</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>
    <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>
于 2012-07-13T14:38:02.937 に答える