В общем, необходимо определить context-item
для xsl:evaluate
, если мы предположим, что у вас есть xsl:evaluate
в контексте внутреннего addrmap
, тогда ваш путь addrmap/enum/element[@name='be']/@offset
имеет смысл, только если Вы хотите оценить его относительно корневого узла /
, поэтому вам нужно, например,
<xsl:evaluate xpath="@offset_xpath" context-item="/" as="xs:string"/>
или вам нужно изменить путь. Я добавил as="xs:string"
, поскольку выбрал один узел атрибута, а не его значение может привести к проблемам с вашим xsl:value-of
.
Вот более полный пример xsl:evaluate
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="xs math"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="enum"/>
<xsl:template match="addrmap[@offset_xpath]/ref/@offset">
<xsl:attribute name="{name()}">
<xsl:evaluate xpath="../../@offset_xpath" context-item="/"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
, который преобразует ваш последний входной образец в
<addrmap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="di_do_1430_board" offset="0x0" lsb_size="32">
<addrmap name="be_sys" offset="0x00000000" offset_xpath="addrmap/enum/element[@name='be']/@offset" lsb_size="24">
<ref name="be_reg_acc" path="blocks/be_reg_acc.xml" ref_name="be_reg_acc" offset="0x00000000"/>
</addrmap>
</addrmap>
, так что вы можете видеть, что атрибут offset
дочернего элемента ref
элемента addrmap
был изменен.
Все еще не может понять вашу попытку с данным путем и context-item="."
, потому что я не понимаю, почему тогда относительный путь addrmap/enum/element[@name='be']/@offset
выберет что-нибудь.
В предыдущем примере неясно, для чего rdt:all2dec
делает или нужен, в общем, я думаю, что попытки использовать xsl:choose/xsl:when
для проверки определенной структуры узла легче обрабатываются простым написанием паттернов соответствия, как я это сделал с match="addrmap[@offset_xpath]/ref/@offset
, для другого случая вы можете использовать, например, <xsl:template match="addrmap[not(@offset_xpath)]/ref/@offset">
.