我正在尝试根据类型递归添加持续时间。然而,我第一次被困在如何初始化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>
答案 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"/>
一样,您返回该持续时间值,而返回值 - 返回文本节点(包含持续时间的字符串表示)。