前の要素から値を取得しようとしています。しかし、取得しようとする値は、特定の位置の後、他のノードの位置の前にある必要があります。これどうやってするの?
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'
と現在の position() の間には、既にこの値を持つ既知のコード 'st' があるためです。
<action>
<code>4</code>
<value>64</value>
</action>
これは 0 である必要があります。結果に書き込むノードの最後の位置action/code = 'tr'
と現在の position() の間には、既にこの値を持つ既知のコード 'st' があるためです。
で正しいテストを取得するのに少し行き詰まっていますxsl:when
。誰か助けてくれませんか?