我需要帮助才能获得准确的输出。我借助Sean B. Durkin提供的代码处理了一个xml,用于以下Input 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>
上面的输入XML有一个元素“游戏”,如果我有相同的值“Game_no”&amp;对于以下节点的“组”然后我可以在“。”时为元素“Name”做出所需的输出。在那儿。但是如果我在“Game_no”&amp ;;的每个节点都有相同的值。 “组”我无法实现没有“。”的输出。在元素“名称”。我将放置我想要的输出和我得到的输出。以及代码。 需要帮助为什么我无法实现这一点。
XSL FILE CODE我根据我的预期输出进行了修改:
<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>
注意:问题看起来很相似,但我是一个学习者尝试各种方式修改内部循环。感谢帮助。我很高兴如果我能知道为什么其中一个节点正在消失。
答案 0 :(得分: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>