2016-06-24 10 views
0

Perlを使用してXSLT 1.0変換を実行しようとしています。私はここにsolutionをスクリプトとして使用しています。xslファイルから別のxslファイルへの変数がありません

私の入力xmlファイルは、これと少し似ています。

<?xml version="1.0" encoding="UTF-8" ?> 
    <bsg> 
      <msg> 
       <entry key="testingString">This is a test.</entry> 
       <!-- <trs> This is me, trs!!! </trs> --> 
      </msg> 
    </bsg> 

trs属性は、他のすべてのノードentryにその常に存在していないことを意味オプションです。 エントリは、Perlスクリプトに

<entry key="Doctor" tslate="false">Physician.</entry>

のようなものを持つことができ、私は(たとえばファイルの二つの他のXSLTファイルをインポートXSLTファイルを供給truefalseすなわち、入力XMLファイルを指定でき、オプションのプロパティtslateを持つことができますおよびファイルB)には、変数とテンプレートが定義されています。

ファイルAは、入力XMLファイルからノードを読み取り、次の操作

<xsl:param name="isOTHERFILEavailable"/>  
    <xsl:variable name="tvariables"> 
    <xsl:choose> 
     <xsl:when test="$isOTHERFILEavailable = 'true'"> 
     <xsl:copy-of select="document($OTHERTHE_File)/bsg/msg"/> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:variable> 

isOTHERFILEavailableを行うOTHERFILEが存在するか否かを検証するのPerlファイルから渡された文字列パラメータです。

このtvariablesは、

<xsl:template match="msg"> 
<xsl:variable name="trsExists"> 
      <xsl:for-each select="entry"> 
       <xsl:variable name="current_key" select="@key"/> 
       <xsl:variable name="trsMatch" select="$tvariables/msg/entry[@key = $current_key]"/> 
       <xsl:choose> 
        <xsl:when test="$trsMatch and normalize-space($trsMatch/text) = normalize-space(.) and (not(@tslate) or @tslate = true())"> 
         <xsl:copy> 
          <xsl:copy-of select="$trsMatch/@key|$trsMatch/tvariables/text()|@context"/>      
         </xsl:copy> 
        </xsl:when> 
       </xsl:choose> 
      </xsl:for-each>   
</xsl:variable> 
</xsl:template> 

以下のようにファイルB内の他の操作を実行するためにアクセスされた私の問題は、ある私は、この行に到達すると、次のように

<xsl:variable name="trsMatch" select="$tvariables/msg/entry[@key = $current_key]"/>

Perlのエラーアウト

Invalid type runtime error: file B.xslt line # element variable Failed to evaluate the expression of variable 'tvariables'

明白なものがありませんか? =>すべて

P.Sは同じでXSLT 2.0(サクソン)とを使用して、Javaから変換実行すると正常に動作tvariablesが定義されていない場合でも、isOTHERFILEavailablefalseあるとき、それはあります。

+0

'$ OTHERTHE_File'と' document($ OTHERTHE_File)/ bsg/msg'はどうやって渡されるのでしょうか?おそらく、$ OTHERTHE_Fileを見つけるのがパスの問題でしょうか?それは完全なパスですか? –

+0

@StefanHegny ..はい、指定されたパスは完全修飾パスです。 'OTHER_File'は常に存在するとは限りません。私はなぜjavaの変換がうまくいくのだろうかと思います。 – Recker

+0

あなたの質問タイトルは何か「xsltファイルから別のファイルに」何かを示唆していますが、2つのxsltsが関係していますか?どのように "結合"されていますか? –

答えて

1

$ tvariableはxmlフラグメントです。

私はPerlがXSL 1.0プロセッサを使用しているようです。あなたの問題は、$ tvariableをフラグメントからノードセットに変換してから使用する必要があるということです。 XSL 2は、コードがSaxonで動作する理由と同じようにフラグメントを処理します。 たいていのXSL 1.0プロセッサ(プレハップは?)は、拡張機能を持つフラグメントをサポートしています。詳細については、ドキュメントを確認する必要があります。ノードセットの機能についての詳細は

select="node-set($tvariables)/msg/entry[@key = $current_key]" 

チェックアウトhttp://www.xml.com/pub/a/2003/07/16/nodeset.html: SELECT文は次のようになります。

関連する問題