Я пытаюсь получить значения из предыдущих элементов. Но значение, которое я пытаюсь восстановить, должно быть после определенной позиции и перед другой позицией узлов. Как я могу это сделать?Получить значение между позициями узлов XML
Пример 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
. Может ли кто-нибудь помочь?
Мартин, могли бы вы объяснить строку '' , потому что я пытаюсь вставить ваше решение в общую таблицу стилей, которую я имею, но я не могу заставить ее работать. Похоже, эта строка не дает никакого вывода. См. Полный исходный XML и XSLT здесь: http://pastebin.com/JC9Gqdgb –
Похоже, проблема возникает из-за пространства имен по умолчанию в документе 'xmlns =" http://www.company.com/log/lk/pl «'. Я не совсем понимаю, почему –
@MarkVeenstra, поскольку ваш XSLT определяет пространство имен по умолчанию для элементов, элементы внутри 'param', которые я установил, также попадают в это пространство имен и таким образом путь' code code-map/code/@ from' не выбирает их. Вам нужно поставить ' ...' на параметр, чтобы избежать этой проблемы. –