Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

戴夫

我很好奇 Saxon XSLT 解析器是否会优化隧道参数传递 - 如果使用相同的值,是否会重新创建?或者,它是否使用当前副本?

我不确定是否有必要提供一个示例,但我已尝试在下面说明我的特定用例。

示例输入 xml:

<formDefinition sysid="1">
    <subform sysid="2">
        <subform layoutGrid="8" sysid="3">
            <field weight="2" sysid="4">
                <bind match="none" />
                <type><date /></type>
            </field>
        </subform>
    </subform>
</formDefinition>

提供一些上下文 - 子表单元素类似于 HTML DIV 元素,字段元素类似于 HTML INPUT 元素。layoutGrid 属性可以由子表单设置或覆盖,并由后代使用,例如字段。

我的实际样式表和“formDefinition”要大得多,使用了许多隧道参数和许多难以分区的相互关联的设置,因此很难避免将参数重置为其现有值。

我已经尝试在下面给出一个一般流程来说明我如何只设置一个隧道参数。

示例样式表 -

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[@sysid]">
    <xsl:apply-templates select="." mode="render" />
</xsl:template>

<xsl:template match="/formDefinition" mode="render">
    <xsl:copy>
         <xsl:next-match />
    </xsl:copy>
</xsl:template>

<xsl:template match="subform" mode="render">
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" />
    <xsl:copy>
        <xsl:attribute name="effLayoutGrid" select="$pLayoutGrid" />
        <xsl:next-match />
    </xsl:copy>
</xsl:template>

<xsl:template match="field" mode="render">
   <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" />
     <xsl:copy>
        <xsl:attribute name="effLayoutGrid" select="$pLayoutGrid" />
        <xsl:next-match />
    </xsl:copy>
</xsl:template>

<xsl:template match="*" mode="render">
    <xsl:apply-templates select="*[not(@sysid)]" />
    <xsl:call-template name="step" />
</xsl:template>

<xsl:template name="step">
    <xsl:apply-templates select="*[@sysid]">
        <xsl:with-param name="pLayoutGrid" as="xs:decimal" tunnel="yes">
            <xsl:apply-templates select="." mode="layoutGrid" />
        </xsl:with-param>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="/formDefinition" mode="layoutGrid">
    <xsl:sequence select="xs:decimal(12)" />  
</xsl:template>

<xsl:template match="subform" mode="layoutGrid">
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" />
    <!-- potentially resetting the same value here -->
    <xsl:sequence select="(@layoutGrid, $pLayoutGrid)[1]" />  
</xsl:template>

<xsl:template match="field" mode="layoutGrid">
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" />
    <!-- setting value to current value -->
    <xsl:sequence select="$pLayoutGrid" />  
</xsl:template>

</xsl:stylesheet>

输出:

<formDefinition>
    <subform effLayoutGrid="12">
        <subform effLayoutGrid="12">
            <field effLayoutGrid="8">
                <bind match="none" />
                <type>
                    <date />
                </type>
            </field>
        </subform>
    </subform>
</formDefinition>

我的问题是,在示例的上下文中 - 重置 pLayoutGrid 隧道参数是否实际上创建了一个新的“对象”,还是在将值设置回其当前值时重用了当前的对象?

在我的完整代码中,我也有 xml 元素/树的隧道参数。我提到这一点是因为我想知道“基本”类型和 xml 元素之间是否存在差异。

迈克尔·凯

当 Saxon 调用模板时,它首先创建一个新的 XPathContext 对象;这对应于 XPath 和 XSLT 规范中定义的“动态上下文”(除了在执行范围内不变的部分,如当前日期/时间)。新的 XPathContext 对象复制调用者上下文的某些方面并重新初始化其他部分(如局部变量)。

XPathContext 对象包含一个名为 tunnelParams 的字段,其值为 ParameterSet;这是一组名称/值对,类似于 HashMap。当模板被调用时,会创建一个新的 ParameterSet 对象,其中包含调用者传递的 ParameterSet 中的条目和被调用者声明的新隧道参数的联合。ParameterSet 中的条目被复制,但当然不需要复制值本身,因为所有 XDM 值都是不可变的。

话虽如此,我在理解您的问题的确切含义时遇到了一些麻烦。如果您将隧道参数“重置”为现有值(例如,全局变量中的值),则 ParameterSet 将仅包含对该值的引用。如果你使用一些计算来设置它,比如

<xsl:with-param name="tun-par" select="23 to 50"/>

那么它不会认识到新值与某些先前值相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Saxon XSLT 处理器避免换行

来自分类Dev

XSLT 3.0流(Saxon)

来自分类Dev

如何使用saxon将文档类型参数传递给xslt?

来自分类Dev

如何使用Saxon将文档类型参数传递给xslt?

来自分类Dev

如何使用 Saxon/C PHP-API 进行 xslt 转换

来自分类Dev

Saxon XSLT:序列化器产生奇怪的缩进

来自分类Dev

检查XSLT 2.0,saxon9HE是否存在xml文件

来自分类Dev

如何在PowerShell中使用Saxon XSLT转换器捕获xsl:message输出

来自分类Dev

在Saxon XSLT解析器中验证XSL时,无效的属性名称xmlns:xsl1

来自分类Dev

使用Saxon通过XSLT生成URL

来自分类Dev

XSLT 3.0部分流(Saxon)

来自分类Dev

xslt:Saxon中的消息-消息在哪里?

来自分类Dev

Saxon SQL 扩展不适用于 Saxon 9.8.0.8 PE 或 EE 上的 XSLT

来自分类Dev

Saxon XSLT2.0从字符串中提取数字

来自分类Dev

XSLT使用Saxon更改属性名称空间

来自分类Dev

带有Saxon和EXSLT.org的RegEx的XSLT

来自分类Dev

使用XML :: Saxon :: XSLT2转换XHTML

来自分类Dev

XSLT转换,无需使用Saxon解析输入XML

来自分类Dev

XSLT2.0 | Saxon HE | passing separator as param

来自分类Dev

使用Saxon,在XSLT中递增或递减全局变量

来自分类Dev

Saxon XSLT2.0从字符串中提取数字

来自分类Dev

如何为命令行Saxon XSLT转换添加清单

来自分类Dev

在 Saxon 9.8 中导入的 XSLT 样式表 URI

来自分类Dev

使用 saxon 9 HE 在 xslt 中使用 javascript 函数

来自分类Dev

使用Camel XSLT组件时无法使用net.sf.saxon.jaxp.TransformerImpl.setMessageEmitter(net.sf.saxon.event.Receiver)

来自分类Dev

使用XSLT / Saxon,当使用文档功能访问Web服务时如何获得所需的内容类型?

来自分类Dev

在DOCTYPE XSLT 2.0 Saxon9he中插入ENTITY声明

来自分类Dev

xml到xhtml:添加了空的名称空间属性(xslt 2.0,saxon9he)

来自分类Dev

在XSLT和SAXON(9.1.8)中运行自定义Java函数

Related 相关文章

  1. 1

    使用 Saxon XSLT 处理器避免换行

  2. 2

    XSLT 3.0流(Saxon)

  3. 3

    如何使用saxon将文档类型参数传递给xslt?

  4. 4

    如何使用Saxon将文档类型参数传递给xslt?

  5. 5

    如何使用 Saxon/C PHP-API 进行 xslt 转换

  6. 6

    Saxon XSLT:序列化器产生奇怪的缩进

  7. 7

    检查XSLT 2.0,saxon9HE是否存在xml文件

  8. 8

    如何在PowerShell中使用Saxon XSLT转换器捕获xsl:message输出

  9. 9

    在Saxon XSLT解析器中验证XSL时,无效的属性名称xmlns:xsl1

  10. 10

    使用Saxon通过XSLT生成URL

  11. 11

    XSLT 3.0部分流(Saxon)

  12. 12

    xslt:Saxon中的消息-消息在哪里?

  13. 13

    Saxon SQL 扩展不适用于 Saxon 9.8.0.8 PE 或 EE 上的 XSLT

  14. 14

    Saxon XSLT2.0从字符串中提取数字

  15. 15

    XSLT使用Saxon更改属性名称空间

  16. 16

    带有Saxon和EXSLT.org的RegEx的XSLT

  17. 17

    使用XML :: Saxon :: XSLT2转换XHTML

  18. 18

    XSLT转换,无需使用Saxon解析输入XML

  19. 19

    XSLT2.0 | Saxon HE | passing separator as param

  20. 20

    使用Saxon,在XSLT中递增或递减全局变量

  21. 21

    Saxon XSLT2.0从字符串中提取数字

  22. 22

    如何为命令行Saxon XSLT转换添加清单

  23. 23

    在 Saxon 9.8 中导入的 XSLT 样式表 URI

  24. 24

    使用 saxon 9 HE 在 xslt 中使用 javascript 函数

  25. 25

    使用Camel XSLT组件时无法使用net.sf.saxon.jaxp.TransformerImpl.setMessageEmitter(net.sf.saxon.event.Receiver)

  26. 26

    使用XSLT / Saxon,当使用文档功能访问Web服务时如何获得所需的内容类型?

  27. 27

    在DOCTYPE XSLT 2.0 Saxon9he中插入ENTITY声明

  28. 28

    xml到xhtml:添加了空的名称空间属性(xslt 2.0,saxon9he)

  29. 29

    在XSLT和SAXON(9.1.8)中运行自定义Java函数

热门标签

归档