2011-03-25 4 views
3

で私はlibxsltのからこれを取得しています:テストのparam値の型XSL

XSLTProcessor::transformToXml(): Invalid type 
XSLTProcessor::transformToXml(): xmlXPathCompiledEval: 1 objects left on the stack. 

私は、文字列値またはノードセットを持つことができるのいずれかparamを渡しています。私はそれが特定の部分文字列を含んでいるかどうかをテストしようとしており、その場合、その値を別のパラメータに割り当てます。

呼び出しテンプレート:

<xsl:call-template name="img"> 
    <xsl:with-param name="upload" select="'url.com/image.jpg'"/> 
    <xsl:with-param name="w" select="200"/> 
    <xsl:with-param name="h" select="200"/> 
</xsl:call-template> 

と呼ばれるテンプレート:

<xsl:template name="img" match="*" mode="w"> 
    <xsl:param name="upload" select="."/> 

    <xsl:param name="JITexternal"> 
     <xsl:choose> 
      <xsl:when test=" 
       not($upload/meta) and (contains($upload, '.jpg') 
       or 
       contains($upload, '.png')) 
       "> 
       <xsl:value-of select="$upload"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="0"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:param> 
</xsl:template> 

私はlibxsltのトリッピングされるかわからないのですが、私はこれらのテストと値を実行することを事実だと思います上記の型エラーをスローする文字列です。

最も重要なのはですが、パラメータの値の型をテストする良い方法はありますか?

UPDATE:正確に型チェックされていないが、私は私のテストを実行する前string()に結果ツリーフラグメントを変換すると、アウト爆撃するlibxsltのを防ぐ​​ことがわかっfull XSL script on GitHub

+1

はあなたをしていますXSLT 1または2を使用していますか? – Ross

+0

私はLibXSLT 1.1.26-6を使用しています。 – tmslnz

+2

@tmslnz:渡すデータ型を知っている必要があります。 XSLT/XPath 1.0には型チェックのようなものはありません。これはXSLT/XPath 2.0で行うことができますが、理由は主にスキーマ意識であり、あなたがしようとしているものではありません。 –

答えて

3

<xsl:param name="JITexternal"> 
     <xsl:choose> 
      <xsl:when test="starts-with(string($upload), 'http://')"> 
       <xsl:value-of select="$upload"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="0"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:param> 
+0

XPath 1.0関数は暗黙的キャストを使用します。その 'string()'呼び出しは必要ありません... –

関連する問題