Я пытаюсь получить значения из предыдущих элементов. Но значение, которое я пытаюсь получить, должно быть после определенной позиции и перед позицией других узлов. Как я могу это сделать?
Пример XML:
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
<code>tr</code>
<value>503</value>
</action>
<action>
<code>co</code>
<value>0</value>
</action>
<action>
<code>cou</code>
<value>0</value>
</action>
<action>
<code>tr</code>
<value>87</value>
</action>
<action>
<code>st</code>
<value>0</value>
</action>
<action>
<code>wta</code>
<value>0</value>
</action>
<action>
<code>pi</code>
<value>0</value>
</action>
<action>
<code>tr</code>
<value>64</value>
</action>
<action>
<code>st</code>
<value>0</value>
</action>
<action>
<code>del</code>
<value>0</value>
</action>
<action>
<code>tr</code>
<value>27</value>
</action>
<action>
<code>wa</code>
<value>0</value>
</action>
<action>
<code>dec</code>
<value>0</value>
</action>
</actions>
Текущий XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs fn">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/actions">
<result>
<!-- Loop through all action elements -->
<xsl:for-each select="action">
<!-- Display only the needed action in the result file -->
<xsl:if test="code = 'co' or code = 'st' or code = 'dec' or code = 'pi' or code = 'del'">
<action>
<code>
<xsl:choose>
<xsl:when test="code = 'co'">1</xsl:when>
<xsl:when test="code = 'st'">5</xsl:when>
<xsl:when test="code = 'dec'">2</xsl:when>
<xsl:when test="code = 'pi'">3</xsl:when>
<xsl:when test="code = 'del'">4</xsl:when>
</xsl:choose>
</code>
<!-- Get some positions in variables -->
<xsl:variable name="previousPosition"><xsl:value-of select="position() - 1" /></xsl:variable>
<xsl:variable name="lastTRPosition"><xsl:value-of select="count((preceding::action[code = 'tr'])[last()]/preceding::action)+1" /></xsl:variable>
<xsl:variable name="currentPosition"><xsl:value-of select="position()" /></xsl:variable>
<!-- Should be the value of the preceding action element with code 'tr' (last occurence). But only use when between the last preceding action element with code 'tr' and the current node position NO known code is used ('co', 'st', 'dec', 'pi' or 'del') -->
<value>
<xsl:choose>
<xsl:when test="(preceding::action[code = 'tr']/value)[last()] != ''"> <!-- some work to do here -->
<xsl:value-of select="round((preceding::action[code = 'tr']/value)[last()])" />
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</value>
</action>
</xsl:if>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
Текущий результат:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<action>
<code>1</code>
<value>503</value>
</action>
<action>
<code>5</code>
<value>87</value>
</action>
<action>
<code>3</code>
<value>87</value>
</action>
<action>
<code>5</code>
<value>64</value>
</action>
<action>
<code>4</code>
<value>64</value>
</action>
<action>
<code>2</code>
<value>27</value>
</action>
</result>
Желаемый результат:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<action>
<code>1</code>
<value>503</value>
</action>
<action>
<code>5</code>
<value>87</value>
</action>
<action>
<code>3</code>
<value>0</value>
</action>
<action>
<code>5</code>
<value>64</value>
</action>
<action>
<code>4</code>
<value>0</value>
</action>
<action>
<code>2</code>
<value>27</value>
</action>
</result>
Изменения и почему?
<action>
<code>3</code>
<value>87</value> <!-- should be 0 -->
</action>
Это должно быть 0. Потому что между позицией последнего action/code = 'tr'
и текущей позицией() узла для записи в результате находится известный код 'st', который уже имеет это значение.
<action>
<code>4</code>
<value>64</value>
</action>
Это должно быть 0. Потому что между позицией последнего action/code = 'tr'
и текущей позицией() узла для записи в результате находится известный код 'st', который уже имеет это значение.
Я немного застрял в получении правильного теста в xsl:when
. Может кто-нибудь помочь?