2015-02-03 8 views
0

У меня есть следующий код в XSL 2.0. Однако из-за ограничений, налагаемых средой, я должен вернуться к версии XSL 1.0. Так как функции не разрешены в XSL 1.0, как я буду делать следующее в 1.0?XSLT 1.0 - вместо функции

<!-- a custom 'contains' implementation --> 
<xsl:function name="my:contains" as="xs:boolean"> 
    <xsl:param name="str" as="xs:string" /> 
    <xsl:param name="list" as="xs:string+" /> 
    <xsl:variable name="temp" as="xs:boolean*"> 
    <xsl:for-each select="$list"> 
     <xsl:if test="contains($str, .)"> 
     <xsl:sequence select="xs:boolean('true')" /> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:variable> 
    <xsl:sequence select="if ($temp[1] = xs:boolean('true')) then xs:boolean('true') else xs:boolean('false')" /> 
</xsl:function>  

    <xsl:param      name = "excludedSections" 
           select = "('AboutThis','79','GetMore')"/> 


**Being used as** 



    <xsl:if test = "(not(my:contains($sectionId, $excludedSections)) 
               and 
               (contains(
               concat(' ', @IncludedDevices, ' '), 
               concat(' ', $targetedDevice, ' ') 
               ) `enter code here` 
               or 
               not(@IncludedDevices) 
              ) 
               and 
               (not(contains(
               concat(' ', @ExcludedDevices, ' '), 
               concat(' ', $targetedDevice, ' ') 
               )) 
               or 
               not(@ExcludedDevices) 
              ))"> 
      .......Do something.... 
    </xsl:if> 

Спасибо, GP

+0

Вы можете рассмотреть http://codereview.stackexchange.com/, если вы ищете обзор данного кода. –

+1

@StephenReindl Речь идет о «переводе» текущего кода с 2.0 на 1.0, который ** не относится к обзору кода –

+0

@GP_help, если ваш комментарий относится к моему ответу, тогда вы можете принять его, чтобы ваш вопрос был помечен как ответил. –

ответ

1

Ну вы можете написать именованный шаблон для реализации вызываемой блок кода в XSLT 1.0. Однако вам кажется, что вы просто хотите проверить, содержит ли ваш список строку, содержащую первый аргумент, если у вас есть exsl:node-set (define xmlns:exsl="http://exslt.org/common"). Я бы определил список как фрагмент дерева результатов и преобразовал его в набор узлов:

<xsl:param name="excludedSectionsRtf"> 
    <item>AboutThis</item> 
    <item>79</item> 
    <item>GetMore</item> 
</xsl:param> 

<xsl:variable name="excludedSections" select="exsl:node-set($excludedSectionsRtf)/item"/> 

, а затем проверка содержит <xsl:if test="not($excludedSections[contains($sectionId, .)])">...</xsl:if>, который в основном проверяет, нет ли предмета, содержащегося в $sectionId.

Это предполагает, что ваши функции XSLT 2.0 может быть упрощен до

<xsl:function name="my:contains" as="xs:boolean"> 
    <xsl:param name="str" as="xs:string" /> 
    <xsl:param name="list" as="xs:string+" /> 
    <xsl:sequence select="some $s in $list satisfies contains($str, $s)"/> 
</xsl:function> 
Смежные вопросы