1

我想选择在 Addl_Information 部分出现 Plan 子节点的 Worker 节点

<xsl:mode streamable="yes"/>
<xsl:template match="Worker[Addl_Information/Plan]">

当我使用上面的代码时,我收到来自 Saxon-EE 9.6.0.5 处理器的错误说

XTSE3430: Template rule is declared streamable but it does not satisfy the streamability rules. * The match pattern is not motionless

我究竟做错了什么?

我在w3c 网站上看到了(类似的)静止模式的例子,但它对我不起作用,请指教。

更新:这是我的样式表。我试图只包括在他们的工人数据中记录了某个计划的人。请注意,下面的patth变量是我试图评估的另一个角度 - 基本上在剩余代码周围有一个 IF 条件。那也行不通。

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:mode streamable="yes"/>
        <xsl:template match="Worker_Sync">
            <File>
                <xsl:apply-templates select="Worker"/>    
            </File>
        </xsl:template>

        <xsl:template match="Worker">
            <xsl:variable name="ThisPerson" select="copy-of()"/> 
            <xsl:variable name="patth" select="Additional_Information/ws:plan"/>
            <xsl:if test="$ThisPerson/$patth">
                <Row>
                    <A1_Account_Number><xsl:value-of select="$ThisPerson/Additional_Information/Account_Number"/></A1_Account_Number>
                    <A2_Employee_Number>...</A2_Employee_Number>
                </Row>
            </xsl:if>
        </xsl:template>
    </xsl:stylesheet>
4

2 回答 2

1

可流模式下的模板规则必须具有静止的匹配模式。在这种情况下,“不动”本质上意味着您可以在解析器位于元素开始标记处时评估模式。在这种情况下,您不能这样做,因为谓词测试是否存在Addl_Information有孙子的孩子,Plan如果不向前阅读开始标签之外的内容,您无法判断这些是否存在。

我很高兴从整体上看一下样式表,看看我是否可以提出任何建议以使其可流式传输,前提是它相当紧凑。

==稍后==

您可以使用在遇到每个 Worker 元素时对其进行复制的方法,在这种情况下,您只需要在复制的元素中进行所有后续访问:

<xsl:variable name="ThisPerson" select="copy-of()"/> 
<xsl:if test="$ThisPerson/Additional_Information/ws:plan">
    <Row>
        <A1_Account_Number><xsl:value-of select="$ThisPerson/Additional_Information/Account_Number"/>   </A1_Account_Number>
        <A2_Employee_Number>...</A2_Employee_Number>
    </Row>
</xsl:if>

这可能是最简单的解决方案。可能有避免复制操作的方法(取决于确切的源文档结构),但它会更复杂,除非单个 Worker 元素非常大,否则不值得努力。

于 2017-07-04T07:28:25.237 回答
0

我建议使用

    <xsl:template match="Worker_Sync">
        <File>
            <xsl:apply-templates select="copy-of(Worker)[Addl_Information/Plan]" mode="some-non-streamable-mode"/>    
        </File>
    </xsl:template>

然后在您的模板中,Worker您不需要测试,只需

    <xsl:template match="Worker" mode="some-non-streamable-mode">
            <Row>
                <A1_Account_Number><xsl:value-of select="Additional_Information/Account_Number"/></A1_Account_Number>
                <A2_Employee_Number>...</A2_Employee_Number>
            </Row>
    </xsl:template>
于 2017-07-04T10:58:28.507 回答