如何使用评估

时间:2018-05-16 07:09:07

标签: xml saxon xslt-3.0

我目前正在查看我们的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>

我试图从我的枚举中获取值(ch_handler_ch_type),但使用上面的表达式xsl:evaluate只给我#document / fragment我无法弄清楚如何获取特定值

我正在使用Saxon-EE 9.8.0.8

问候

修改

我已将枚举替换为xi:include,以便明确了文件的外观。我的目标是 offset_xpath 所在的子 addrmap 节点,我需要更改偏移值。使用枚举节点中定义的偏移值。

我已成功使用

从枚举中获取值
<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 :(得分:0)

一般情况下,如果我们假设您在内部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">