Как использовать оценить - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я смотрю на наш код XML, для которого у нас есть таблица стилей для обработки.

Мой код выглядит следующим образом

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-model href="register_tool/rules/rules.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>

<addrmap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="register_tool/rules/man_schema.xsd" name="di_do_1430_board" offset="0x0" lsb_size="32">

    <enum name="ch_handler_ch_type" bitfield="false">
        <element name="be" value="0" offset="0x00000000"/> 
    </enum>

    <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="0x0" />
    </addrmap>

</addrmap>

часть моей таблицы стилей выглядит следующим образом

<xsl:choose>
  <xsl:when test="@offset_xpath">
    <xsl:variable name="resolved_offset"><xsl:evaluate xpath="@offset_xpath"></xsl:evaluate></xsl:variable>
    <xsl:apply-templates mode="map">
      <xsl:with-param name="offset" select="rdt:all2dec($resolved_offset)"/>
    </xsl:apply-templates>
  </xsl:when>
  <xsl:otherwise>
    <xsl:apply-templates mode="map">
      <xsl:with-param name="offset" select="rdt:all2dec(@offset)"/>
    </xsl:apply-templates>
  </xsl:otherwise> 
</xsl:choose>

Я пытаюсь получить значение из моего enum (ch_handler_ch_type), но с помощью приведенного выше выражения xsl :valuate only дает мне # документ / фрагмент. Я не могу понять, как получить конкретное значение

Я использую Saxon-EE 9.8.0.8

С уважением

EDIT

Я заменил xi: include на enum , чтобы немного понять, как выглядит файл. Я нацеливаюсь на дочерний addrmap узел, где расположен offset_xpath , мне нужно изменить значение смещения. со значением смещения, определенным в узле enum .

Мне удалось получить значение из перечисления с помощью

<xsl:variable name="resolved_offset"><xsl:value-of><xsl:evaluate xpath="@offset_xpath" context-item="." as="xs:string"></xsl:evaluate></xsl:value-of></xsl:variable>

Теперь я просто не могу понять, как изменить смещение значения атрибута в узле addrmap.

Я пытался сделать тамплату

<xsl:template match="@offset[parent::addrmap]">
  <xsl:param name="resolved_offset" tunnel="yes"/>
  <xsl:attribute name="offset">
    <xsl:value-of select="$resolved_offset"/>
  </xsl:attribute>
</xsl:template>

Я также вижу, что он вызывается правильно, однако изменение не происходит

1 Ответ

0 голосов
/ 16 мая 2018

В общем, необходимо определить 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">.

...