2017-08-13 21 views
0

私はしようとしているXSLT変換に関する問題に遭遇しています。全体のプロジェクトでは、データベースのアップロードのためにXML文書をCSVファイルに変換するように取り組んでいます。問題は、XMLがISO8601形式(YYYY-MM-DDT00:00:00)の属性値として日付を送信することですが、データベースがCSVファイルから取得するためには、MM/DD/YYYYに変換する必要があります。ここでフォーマットXSLTを使用したXML属性値の日付

は、XMLのサンプルです:

<GetChanged> 
    <UserInformation> 
    <Column Name="id" Value="555555555"/> 
    <Column Name="name" Value="Kevin"/> 
    <Column Name="bday" Value="1990-01-01T00:00:00"/> 
    </UserInformation> 
</GetChanged> 

は、ここで私が使用しようとしているXSLTです:しかし

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:csv="csv:csv"> 

<xsl:output method="text"/> 

<xsl:template match="GetChanged"> 
<!-- header --> 
    <xsl:text>"id","name","bday"&#10;</xsl:text> 
<!-- data rows --> 
<xsl:for-each select="UserInformation"> 

    <!-- data cells --> 
    <xsl:for-each select="Column[@Name='id']"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="@Value"/> 
    <xsl:text>"</xsl:text> 
</xsl:for-each> 
<xsl:text>,</xsl:text> 
    <xsl:for-each select="Column[@Name='name']"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="@Value"/> 
    <xsl:text>"</xsl:text> 
</xsl:for-each> 
<xsl:text>,</xsl:text> 
    <xsl:for-each select="Column[@Name='bday']"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="format-date(@Value, '[M01]/[D01]/[Y0001]')"/> 
    <xsl:text>"</xsl:text> 
</xsl:for-each> 
      <xsl:if test="position()!=last()"> 
      <xsl:text>,</xsl:text> 
      </xsl:if> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

、私は鋸山を使用してルビーを介してこれを実行すると、私はエラーを取得して終わります:

RuntimeError:ランタイムエラー:要素値- XPath評価が結果を返しませんでした

この日付を適切にフォーマットするために何ができるか考えてみませんか?

ありがとうございます!

+0

は、あなたのプロセッサがXSLT 2.0をサポートしていますか? –

答えて

0

YYYY-MM-DDT00:00:00として表される値は、日付ありません。変更してみてください:

<xsl:value-of select="format-date(@Value, '[M01]/[D01]/[Y0001]')"/> 

に:両方の機能は、XSLT 2.0プロセッサを必要とすること

<xsl:value-of select="format-dateTime(@Value, '[M01]/[D01]/[Y0001]')"/> 

注意。あなたのプロセッサのみがXSLT 1.0をサポートしている場合は、文字列操作を使用して日付を再フォーマットすることができます

<xsl:value-of select="substring(@Value, 6, 2)"/> 
<xsl:text>/</xsl:text> 
<xsl:value-of select="substring(@Value, 9, 2)"/> 
<xsl:text>/</xsl:text> 
<xsl:value-of select="substring(@Value, 1, 4)"/> 
+0

NokogiriはXSLT 2.0をサポートしていません –

0

鋸山は、XSLTのためlibxsltに依存します。

In Nokogiri 1.6.0 and later libxml2 and libxslt are bundled with the gem, but if you want to use the system versions:

(詳細はこちらを参照してください。https://github.com/sparklemotion/nokogiri

libxsltはXSLT-1.0

A separate library called libxslt is available implementing XSLT-1.0 for libxml2

(詳細はこちらを参照してください。http://xmlsoft.org/XSLT.html)をサポートしてい

を次の方法でその回避できこのようなソリューションを使用して:Convert date from DD-MMM-YYYY to YYYYMMDD format in xslt 1.0

またはここで説明するようないくつかのサブストリング/連結を行います。Displaying Date as DD-MM-YYYY within XSLT/XML

関連する問題