Процессор xslt 2 с поддержкой exslt :valu () - PullRequest
0 голосов
/ 30 апреля 2011

В таблице стилей XSLT 2

Если простое логическое выражение, имеющее только 0, 1 и, или, (,) токены это содержится в строковой переменной.

Чем получить окончательное значение выражения. вместе с тем мне нужно использовать функцию tokenize (), replace ().

Есть ли здесь какой-нибудь процессор xslt 2, поддерживающий exslt :valu () также в Ubuntu? Saxon, Xalan, xsltproc Я пытался, но Xalan, xsltproc не поддерживает tokenize () и replace (). не уверен насчет оценки () также.

<xsl:template name="test">
  <xsl:variable name="nexpression" select="myfun:getexpr()"/>
  <!-- return boolean exp   like "0 or (1 and 1) or 1" -->
  <xsl:value-of select="exslt:evaluate($nexpression)"/>
</xsl:template>

Здесь myfun: getexpr () возвращает простое логическое выражение.

или здесь некоторое другое приближение к окончательному значению этого логического выражения.

Ответы [ 2 ]

0 голосов
/ 01 мая 2011

Я пробовал myfn: getexpval ()

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exslt="http://exslt.org/common"
                xmlns:myfn="http://whatever"
                xmlns:functx="http://www.functx.com">

  <xsl:function name="myfn:getexpval">
    <xsl:param name="exp"/>
    <xsl:value-of select="if (matches($exp, $openp) != ()) then
                            myfn:clget-simple-expval(concat(substring-before($exp, $openp),
                                                            myfn:clfoundopen(substring-after($exp, $openp))))
                          else myfn:clget-simple-expval($exp)
                          "/>

  </xsl:function>

  <xsl:function name="myfn:clfoundopen">
    <xsl:param name="openexp"/>
    <xsl:value-of select="if (matches($openexp, $openp) != () and
                              functx:index-of-string-first($openexp, $openp) &lt; functx:index-of-string-first($openexp, $closep)
                             ) then
                            myfn:clget-simple-expval(concat(substring-before($openexp, $openp),
                                                            myfn:clfoundopen(substring-after($openexp, $openp))))
                          else
                            myfn:clget-simple-expval(concat(substring-before($openexp, $closep),
                                                            myfn:clfoundopen(substring-after($openexp, $closep))))
                          "/>
  </xsl:function>
  <xsl:function name="myfn:clget-simple-expval">
    <xsl:param name="exp"/>
    <xsl:variable name="ztokens" select="tokenize($exp, 'or')"/>
    <xsl:variable name="forret">
      <xsl:value-of select="some $i in $ztokens satisfies
                            myfn:cland($i) = true()"/>
    </xsl:variable>

    <xsl:value-of select="if ($forret = true())
                          then
                          1
                          else
                          0"/>

  </xsl:function>

  <xsl:function name="myfn:cland">
    <xsl:param name="exp"/>
    <xsl:variable name="ztokens" select="tokenize($exp, 'and')"/>
    <xsl:variable name="forret">
      <xsl:value-of select="every $i in $ztokens satisfies
                            replace($i, ' ', '') eq '1'"/>
    </xsl:variable>
    <xsl:value-of select="$forret"/>
  </xsl:function>

  <xsl:value-of select="myfn:getexpval('0 or ( 1 and 1 )')"/>

</xsl:stylesheet>
0 голосов
/ 01 мая 2011

Saxon имеет функцию расширения saxon :valu (), которая похожа на exslt :valu (), но отличается в деталях; основное отличие состоит в том, что он не разрешает прямой доступ к переменным, объявленным в таблице стилей, но вместо этого допускает передачу параметров.

...