Xml 对内部循环进行分组,但得到;任务在一次测试中失败“XSLT

Xml 对内部循环进行分组,但得到;任务在一次测试中失败“XSLT,xml,xslt,xpath,xml-serialization,xml-parsing,Xml,Xslt,Xpath,Xml Serialization,Xml Parsing,我需要一个帮助来获得准确的输出。我在Sean B.Durkin为以下输入xml提供的代码的帮助下处理xml我更改了代码以获得所需的输出,但在获得准确的输出时遇到了问题。请帮助我在代码中指出哪里出错。 调试时,我可以在“game_no”123和“group”1中找到“室内”的值不可识别 输入XML文件: <?xml version="1.0" encoding="UTF-8"?> <t> <Games> <Game_no>123</Ga

我需要一个帮助来获得准确的输出。我在Sean B.Durkin为以下输入xml提供的代码的帮助下处理xml我更改了代码以获得所需的输出,但在获得准确的输出时遇到了问题。请帮助我在代码中指出哪里出错。 调试时,我可以在“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>    

123
1.
户外运动
高尔夫球
123
1.
室内游戏
国际象棋
223
1.
户外运动
足球
223
2.
室内运动会
高尔夫球
223
1.
户外运动
巴明顿
123
1.
户外运动
网球
123
1.
今天
返回的值不带“.”
123
1.
室内的
使用相同的组123和游戏编号1返回值
123
2.
户外的
使用不同的组2返回值
323
2.
户外的
使用不同的游戏返回值\u no 323
上面的输入XML有一个元素“Games”,其中如果我对以下节点有相同的值“Game_no”和“Group”,那么我可以在有“.”时为元素“Name”生成所需的输出。但是,如果我在“Game_no”和“Group”中的每个节点都有相同的值,那么在元素“Name”中没有“.”就无法实现输出。我将把我想要的输出和我得到的输出放在一起。和代码一起。 需要帮助为什么我不能做到这一点

根据预期输出修改的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>

高尔夫球
国际象棋
网球
返回的值不带“.”
使用不同的组2返回值
足球
巴明顿
高尔夫球
使用不同的游戏返回值\u no 323
所需输出:

<?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>
<?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>

高尔夫球
国际象棋
网球
返回的值不带“.”
使用相同的组123和游戏编号1返回值
使用不同的组2返回值
足球
巴明顿
高尔夫球
使用不同的游戏返回值\u no 323

注意:这个问题看起来很相似,但我是一个尝试各种方法修改innerl循环的学习者。谢谢你的帮助。如果我能知道其中一个节点正在删除,我很高兴。

以下是我所问问题的更新

现在我可以得到想要的输出了。当循环到“否”时,在“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>

应用时,可获得所需的输出:


高尔夫球
国际象棋
网球
返回的值不带“.”
使用相同的组123和游戏编号1返回值
使用不同的组2返回值
足球
巴明顿
高尔夫球
使用不同的游戏返回值\u no 323