XPath не работают в глобальных функциях XSLT - PullRequest
0 голосов
/ 28 июня 2018

Я реализовал следующую глобальную функцию 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 голосов
/ 28 июня 2018

В функции нет узла контекста или элемента контекста, поэтому, если вы хотите получить доступ к узлам из определенного документа, вам нужно определить 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', /)"/>

...