XSLT - 在call-template中初始化xs:duration parm

时间:2017-10-16 14:27:40

标签: xslt-2.0

我正在尝试根据类型递归添加持续时间。然而,我第一次被困在如何初始化xs:duration parm。以下是我正在使用的代码。我运行它时看到一个空序列错误。

输入:

<ES_BMTIMEALLOCATION>
    <duration>
        <ESP_TIMEDURATION time="00:00:15.000" hours="0" minutes="00" seconds="15" milliseconds="000"/>
    </duration>
    <type>
        <popupLookups>
            <POPUPLOOKUP translation1="N"/>
        </popupLookups>
    </type>
</ES_BMTIMEALLOCATION>
<ES_BMTIMEALLOCATION>
    <duration>
        <ESP_TIMEDURATION time="00:11:01.000" hours="0" minutes="11" seconds="01" milliseconds="000"/>
    </duration>
    <type>
        <popupLookups>
            <POPUPLOOKUP translation1="N"/>
        </popupLookups>
    </type>
</ES_BMTIMEALLOCATION>
<ES_BMTIMEALLOCATION>
    <duration>
        <ESP_TIMEDURATION time="00:00:05.000" hours="0" minutes="00" seconds="05" milliseconds="000"/>
    </duration>
     <type>
        <popupLookups>
            <POPUPLOOKUP translation1="Y"/>
        </popupLookups>
     </type>
</ES_BMTIMEALLOCATION>

XSLT代码:

<xsl:template name="sumBrkDur">
        <xsl:param name="iteration" select="1"/>
        <xsl:param name="brkdur" as="xs:duration" select="PT0H0M0S"/>
        <xsl:choose>
            <xsl:when test="following-sibling::*[$iteration]/type/ESP_BMTIMEALLOCATIONTYPE/popupLookups/POPUPLOOKUP/@translation1 = 'Y'">
                <xsl:call-template name="sumBrkDur">
                    <xsl:with-param name="iteration" select="$iteration + 1"/>
                    <xsl:with-param name="brkdur" select="xs:duration($brkdur) + xs:duration(following-sibling::*[$iteration]/duration/ESP_TIMEDURATION/@duration)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$brkdur"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

1 个答案:

答案 0 :(得分:0)

确保样式表为架构数据类型(即xmlns:xs="http://www.w3.org/2001/XMLSchema")设置名称空间,并使用例如xs:dayTimeDuration('PT0H0M0S')构建dayTimeDuration

您还没有显示任何输入数据和输入格式,因此很难说出您希望使用模板实现的目标以及是否需要它。通常,如果您想使用模板或函数返回/创建某种数据类型,请确保使用xsl:sequence而不是xsl:value,因此假设您的模板应返回{{1} },使用例如dayTimeDuration而不是value-of,与<xsl:sequence select="$brkdur"/>一样,您返回该持续时间值,而返回值 - 返回文本节点(包含持续时间的字符串表示)。