XPath在XSLT全局函数中不起作用

时间:2018-06-28 05:43:34

标签: xslt-2.0

我已经实现了以下xslt全局函数,但是不允许使用XPath表达式。

例如:// Track_Chainings / Track_Chaining [Track_ID = $ TrackID] / Begin_Adjacent_Track_ID!=''引发异常。

            <xsl:function name="conn:getConnetion" as="xs:string">
                   <xsl:param name="TYPE" as="xs:string"/>
                   <xsl:param name="TrackID" as="xs:string"/>
                   <xsl:param name="SwitchID" as="xs:string"/>    
                   <xsl:choose>
                        <xsl:when test="($TYPE = 'TrackBegin')">
                            <xsl:if test="((//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/Begin_Adjacent_Track_ID !='') and (//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/Begin_Adjacent_Track_ID !='0'))"> 
                              <xsl:sequence select="concat(concat((TrackID * 10000) , '#'), (concat((//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/Begin_Adjacent_Track_ID * 10000), 1)))"/>
                            </xsl:if>               
                        </xsl:when>
                        <xsl:when test="($TYPE = 'TrackEnd')">            
                            <xsl:if test="((//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/End_Adjacent_Track_ID !='') and (//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/End_Adjacent_Track_ID !='0'))"> 
                              <xsl:sequence select="concat(concat(concat((TrackID * 10000) , 1) , '#'), (//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/End_Adjacent_Track_ID * 10000))"/>
                            </xsl:if>
                        </xsl:when>
                        <!-- <xsl:otherwise></xsl:otherwise> -->
                   </xsl:choose>
             </xsl:function>

请告知我们我们的实现是否存在任何问题。

提前谢谢

1 个答案:

答案 0 :(得分:0)

函数中没有上下文节点或上下文项,因此,如果要访问某个文档中的节点,则需要为该文档或节点定义一个xsl:param并将其传递给函数调用,例如

        <xsl:function name="conn:getConnetion" as="xs:string">
               <xsl:param name="TYPE" as="xs:string"/>
               <xsl:param name="TrackID" as="xs:string"/>
               <xsl:param name="SwitchID" as="xs:string"/> 
               <xsl:param name="track-doc" as="document-node()"/>   
               <xsl:choose>
                    <xsl:when test="($TYPE = 'TrackBegin')">
                        <xsl:if test="(($track-doc//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/Begin_Adjacent_Track_ID !='') and ($track-doc//Track_Chainings/Track_Chaining[Track_ID=$TrackID]/Begin_Adjacen
          ....

,然后使用正确的文档调用该函数,例如<xsl:value-of select="conn:getConnection('foo', 't1', 's2', /)"/>