Доступ к различным узлам в XML - PullRequest
0 голосов
/ 29 ноября 2018

Прошу прощения за плохой заголовок .Я пытаюсь разработать файл XSLT для этого XML:

<game>
    <character>
        <name>Rambo</name>
        <attribute>
            <strength>15</strength>
            <stamina>10</stamina>
            <agility>24</agility>
            <health>100</health>
        </attribute>
    </character>

    <character>
        <name>Sonic X</name>
        <attribute>
            <strength>10</strength>
            <stamina>15</stamina>
            <agility>10</agility>
            <health>100</health>
        </attribute>
    </character>

    <costume>
        <name>Armor</name>
        <attribute>
            <agility>-15</agility>
            <health>50</health>
        </attribute>
    </costume>

    <costume>
        <name>Boots</name>
        <attribute>
            <agility>75</agility>
        </attribute>
    </costume>
</game>

Что должен делать мой XSLT : для каждой комбинации персонажа и костюма необходимо рассчитать комбинированную ловкость.Например (ловкость персонажа) + (ловкость костюма).

Результат должен выглядеть следующим образом:

<boosted_agility>
    <result>
       <character> Character name (e.g. Rambo) </character>
       <costume> Costume name (e.g. Armor) </costume>
       <agility> New agility value (E.g. 24 + (-15) = 9) </agility>
    </result>
    ..........    
<boosted_agility>

Я хотел бы сделать что-то вроде этого (неработающий код ниже):

<xsl:template match="/">
        <boosted_agility> 
            <xsl:for-each select="game/character and game/costume">
                <result>
                    <character> <xsl:value-of select="character.name"/> </character>
                    <costume><xsl:value-of select="costume.name"/></costume>
                    <agility> <xsl:value-of select="costume.attribute.agility"/> + <xsl:value-of select="character.attribute.agility"/></agility>
                </result>
            </xsl:for-each>
        </boosted_agility>
    </xsl:template>

Заранее спасибо!

1 Ответ

0 голосов
/ 29 ноября 2018

Как @ michael.hor257k сказал, что вам нужно два xsl:for-each, но вы также захотите использовать xsl:variable для хранения costumes и текущего character, так как он находится вне области видимости.

Это должно работать:

<xsl:template match="/">
    <boosted_agility> 
        <xsl:variable name="costumes" select="game/costume"/>
        <xsl:for-each select="game/character">
            <xsl:variable name="character" select="."/>
            <xsl:for-each select="$costumes">
                <result>
                    <character><xsl:value-of select="$character/name"/></character>
                    <costume><xsl:value-of select="name"/></costume>
                    <agility><xsl:value-of select="$character/attribute/agility + attribute/agility"/></agility>
                </result>
            </xsl:for-each>
        </xsl:for-each>
    </boosted_agility>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...