如何使用评价
How to use evaluate
我目前正在查看我们的 XML 代码,我们有一个要处理的样式 sheet。
我的代码如下所示
<?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>
我的部分风格 sheet 看起来如下
<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 替换为 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>
现在我不知道如何更改节点地址映射中的属性值偏移量。
我试过做模板
<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>
我还可以看到它被正确调用,但是没有发生变化
一般来说,有必要为xsl:evaluate
定义context-item
,如果我们假设你在addrmap
的上下文中有xsl:evaluate
那么你有 addrmap/enum/element[@name='be']/@offset
的路径只有在你想相对于根节点 /
评估它时才有意义,所以你需要例如
<xsl:evaluate xpath="@offset_xpath" context-item="/" as="xs:string"/>
或者您需要更改路径。我已将 as="xs:string"
添加为 selecting 单个属性节点,而不是它的值会导致 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>
因此您可以看到 addrmap
元素的 ref
子元素的属性 offset
已更改。
仍然无法理解您对给定路径和 context-item="."
的尝试,因为我不明白为什么相对路径 addrmap/enum/element[@name='be']/@offset
会 select 任何东西。
在前面的示例中,不清楚 rdt:all2dec
做什么或需要做什么,一般来说,我认为尝试使用 xsl:choose/xsl:when
检查某个节点结构更容易通过简单地编写来处理匹配模式,就像我用 match="addrmap[@offset_xpath]/ref/@offset
所做的那样,对于另一种情况,您可以使用例如<xsl:template match="addrmap[not(@offset_xpath)]/ref/@offset">
.
我目前正在查看我们的 XML 代码,我们有一个要处理的样式 sheet。
我的代码如下所示
<?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>
我的部分风格 sheet 看起来如下
<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 替换为 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>
现在我不知道如何更改节点地址映射中的属性值偏移量。
我试过做模板
<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>
我还可以看到它被正确调用,但是没有发生变化
一般来说,有必要为xsl:evaluate
定义context-item
,如果我们假设你在addrmap
的上下文中有xsl:evaluate
那么你有 addrmap/enum/element[@name='be']/@offset
的路径只有在你想相对于根节点 /
评估它时才有意义,所以你需要例如
<xsl:evaluate xpath="@offset_xpath" context-item="/" as="xs:string"/>
或者您需要更改路径。我已将 as="xs:string"
添加为 selecting 单个属性节点,而不是它的值会导致 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>
因此您可以看到 addrmap
元素的 ref
子元素的属性 offset
已更改。
仍然无法理解您对给定路径和 context-item="."
的尝试,因为我不明白为什么相对路径 addrmap/enum/element[@name='be']/@offset
会 select 任何东西。
在前面的示例中,不清楚 rdt:all2dec
做什么或需要做什么,一般来说,我认为尝试使用 xsl:choose/xsl:when
检查某个节点结构更容易通过简单地编写来处理匹配模式,就像我用 match="addrmap[@offset_xpath]/ref/@offset
所做的那样,对于另一种情况,您可以使用例如<xsl:template match="addrmap[not(@offset_xpath)]/ref/@offset">
.