В моем XML-документе у меня есть следующие виды узлов:
<parent>
<value id="value1" name="Y" type="number"/>
<value id="value2" name="X" type="number"/>
<value id="value3" name="Z" type="operation" op="-" args="value1;value2"/>
</parent>
И я хочу преобразовать это, чтобы полная операция выглядела так:
<parent>
<value id="value1" name="Y" type="number" />
<value id="value2" name="X" type="number" />
<operation>
<name>Z = Y - X</name>
</operation>
</parent>
Iборюсь с моим шаблоном xsl. Вот полный код XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings">
<xsl:template match="@*|node()" priority="0">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="value[@type='operation']" priority="1">
<xsl:variable name="name">
<xsl:value-of select="concat(@name, ' = ')" />
<xsl:for-each select="str:tokenize(@args, ';')">
<xsl:choose>
<xsl:when test="//value[@id=current()]">
<xsl:value-of
select="concat(//value[@id=current()]/@name, ' ', @op, ' ')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(current(), ' ', @op, ' ')" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
<operation>
<name>
<xsl:value-of select="$name" />
</name>
</operation>
</xsl:template>
</xsl:stylesheet>
Внутри каждого переднего я проверяю, может ли он найти узел corrent, потому что иногда @args операции может быть, например, args="2.00;value1"
.
Очевидно, что что-то не так с моим тестом внутри for-each, потому что результат, который я получаю для входного файла, показанного выше:
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<value id="value1" name="Y" type="number" />
<value id="value2" name="X" type="number" />
<operation xmlns:str="http://exslt.org/strings">
<name>Z = value1 value2 </name>
</operation>
</parent>
Каким должен быть тест, чтобы получить имяправильного значения?