2016-12-14 4 views
0

を再訪しました。おそらくそれは名前空間と関係があります。 そして、私は関数アプローチの結果を理解していません。計算の時間差は、私はこの答えに示す指針に従うことをしようとしている

入力のxml:

<BatchData > 
<Line> 
    <Batch> 
     <start>2011-12-13T16:15:26</start> 
     <end>2011-12-13T16:17:27</end> 
    </Batch> 
</Line> 

XSLファイル:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:date="http://exslt.org/dates-and-times" 
extension-element-prefixes="date" 
> 
<xsl:include href="date.msxsl.xsl" /> 

<!-- msxsl.exe myDateTestInput.xml myDateEXSLT.xsl -o dateTestOut.html--> 
<!-- java -cp C:\XSL\SaxonHE9-7-0-14J\saxon9he.jar net.sf.saxon.Transform -t -s:myDateTestInput.xml -xsl:myDateEXSLT.xsl -o:dateTestOut.html --> 

<xsl:output method="html" /> 
<xsl:template match="/BatchData/Line/Batch"> 
    <html> 
     <head> 

     </head> 

     <body> 

       <table > 
        <tr> 
         <td> 
          <xsl:variable name="time-diff-dur"> 
          <xsl:call-template name="date:difference"> 
           <xsl:with-param name="start" select="start" /> 
           <xsl:with-param name="end" select="end" /> 
          </xsl:call-template> 
          </xsl:variable> 
          <!-- The above returns a duration formatted string, so convert that to seconds: --> 
          <xsl:variable name="time-diff-sec"> 
           <xsl:call-template name="date:seconds"> 
            <xsl:with-param name="seconds" select="$time-diff-dur" /> 
           </xsl:call-template> 
          </xsl:variable> 

          <!-- 
           <xsl:variable name="time-diff-sec" select="date:seconds(date:difference(start, end))" /> 
           <xsl:value-of select="$time-diff-sec"></xsl:value-of> 
          --> 

         </td> 

         </tr> 
       </table> 
     </body> 
    </html> 
</xsl:template> 

私はmsxslとSaxon9heの両方を使用していました。彼らは両方ともテンプレートアプローチでは失敗しましたが、Saxonは少なくともいくつかのエラー情報を提供しました。 XSLで

静的エラー:これは、テンプレートを使用してからのエラーです XTSE0650:myDateEXSLT.xslの行25列51上でテンプレートを呼び出し、XSLの違い 静的エラー:コールませテンプレートは、日付と命名ない存在しますxSl:変数31行目myDateEXSLT.xslの変数: SXWN9001:次の兄弟指示がない変数には、noという名前の変数がありません。効果 スタイルシートの編集中にエラーが報告されました

テンプレートをコメントアウトして関数アプローチのコメントを外すとエラーは表示されませんが、time-diff-secの結果を表データ値として表示する方法はわかりません。代わりに、出力は入力ファイルのちょうど2 datetimesです。

「include」の代わりに「import」を使用しましたが、違いはありませんでした。違いはありますか?

だから、質問を要約する:

  1. 私は、テンプレート方式と間違って何をしましたか?
  2. 関数のアプローチから 値を表示するにはどうすればよいですか?
  3. 'import'と 'include'の間に違いがありますか?

おそらく前者はサイトからプルダウンするためのもので、後者はローカルリソース用です。

ありがとうございました。

これはdate.msxsl.xslというファイルです。そのexslt.orgサイトに問題があるようだから、ここに投稿します。 (拡張子の名前を変更):あなたの特定の質問への答えで date.msxsl.xsl

答えて

2

  1. 「私は、テンプレートメソッドと間違って何をしましたか?「
    <xsl:call-template>
    はまさにそれを行います。name属性で指定されているように、テンプレート呼び出すそれあなたのXSLは、指定された任意のテンプレートを定義しないかdate:differenceまたはdate:seconds、そのようなテンプレートは、で定義された場合、それは自然に失敗しました。インポートまたはインクルードファイルは、それがうまくいくかもしれないが、あなたは含めているファイルは、いずれかのそのようなテンプレートが含まれていません。
  2. 「どのように私は、関数アプローチからの値を表示していますか?」
    代わりの非を呼び出します存在するテンプレートは、代わりに関数を呼び出してみてください。の内容を熟読する、あなたが望む機能が実際にdate:differenceと呼ばれるように見えます。これはMSXSLライブラリでの処理を目的としていますので、使用していることを確認してください。たとえば、Saxonでこれを処理しようとするとエラーが発生します。私はMicrosoftのXML処理スタックに精通していないので、.NETが動作するかどうかは分からない.OxygenXMLから.NET 1.0と.NET 2.0ライブラリを呼び出す予備テストでは、.NETは動作しないことが示唆される。
  3. "は 'import'と 'include'に違いがありますか?"
    要するに、はい。 Stylesheet Inclusion in the official W3 documentationのセクションを参照してください。
    上記の<xsl:include>を使用しています。これには有効なHREF(基本的にはパス)が必要です。 date.msxsl.xslの値を指定すると、XSLパーサーはXSLスタイルシートファイル自体と同じディレクトリにあるdate.msxsl.xslという名前のファイルを探します。そのファイルを自分のXSLと同じディレクトリに保存したと仮定すると、XSLプロセッサはそれを見つけます。ただし、そのファイルにはdate:differenceまたはdate:secondsというテンプレートも含まれていないため、call-template命令が失敗します。 MSXSLを使用して処理する場合

ソースファイルから日付値を抽出、または出力でそれらのフォーマットの詳細を掘り下げるなければ、私は正常に実行されない超シンプル、間に合わせと-例を作成しましたv4.0ライブラリ。

サンプルXSL:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="http://exslt.org/dates-and-times" 
    > 
    <xsl:include href="date.msxsl.xsl" /> 

    <xsl:template match="/"> 
     <TEST> 
      <xsl:value-of select="date:difference('2011-12-13T16:15:26', '2011-12-13T16:17:27')"/> 
     </TEST> 
    </xsl:template> 

</xsl:stylesheet> 

試合/には、論理的なルートに一致しています。これはどの入力でも一致しますので、この例では何も入力する必要はありません。

も注意xmlns:date宣言:dateプレフィックスはINCLUD ファイル(date.msxsl.xsl)で定義されているが、それはまたINCLUDにここで宣言しなければなりませんファイルをINGの。

出力例:

<TEST xmlns:date="http://exslt.org/dates-and-times">PT2M1S</TEST> 

これが動作しているように見えるん:2つの日付、時刻の差は確かに2分1秒です。

これはあなたに基礎を与えるはずです。今度は残りの部分を試してみて、理想的には楽しく学びましょう。 :)

関連する問題