2016-11-30 7 views
0

私のXMLファイルをTeXに転送するとき、私は日付を再フォーマットしようとしました。私の出版社は、日付間の水平スペースを小さくしなければならず、最初のステップを超えることはできません。大括弧で日付を再フォーマット

私の入力ファイルは、ブラケットは日付が確かではないことを意味し、この

<a> 
<date>January 1900</date> 
<date>2. 2. 1902</date> 
<date>3. [3]. 1903</date> 
<date>[4. 4. 1904]</date> 
</a> 

です。すべてのブラケットの組み合わせが可能です。年の第2の数:1 [9] 00。 XSLTはあるべき後 \ newcommand {\ミニ} {\、} 結果:

January 1900 
2.{\mini}2.{\mini}1902 
3.{\mini}[3].{\mini}1903 
[4.{\mini}4.{\mini}1904] 

私は抽出しようとする機能を、書いた私は、TeXに小さなスペースを作るコマンド\ミニを作成しましたそれらの位置を変数に格納し、その後それらを再び連結します。しかし、正しい位置を示す変数を得ることができないので、私は固執しています。

<xsl:function name="foo:date-translate"> 
     <xsl:param name="date-string" as="xs:string"/> 
     <xsl:variable name="opening-square-bracket" as="xs:integer" select="count(substring-before($date-string,'&#91;'))"/> 
     <xsl:variable name="closing-square-bracket" as="xs:integer" select="count(substring-before($date-string,'&#x5b;'))"/> 
     <xsl:variable name="date-string-without-square-brackets" as="xs:string" select="replace(replace($date-string,'\[',''),'\]','')"/> 
     <xsl:choose> 
     <xsl:when test="matches($date-string-without-square-brackets,'\d{1,2}. \d{1,2}. \d{4}')"> 
     <xsl:choose> 
      <xsl:when test="not(contains($date-string,'['))"> 
       <xsl:value-of select="replace($date-string,'(\d{1,2}). (\d{1,2}). (\d{4})','$1\\mini$2\\mini$3')"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="concat(substring(replace($date-string-without-square-brackets,'(\d{1,2}). (\d{1,2}). (\d{4})','$1\\mini$2\\mini$3'),0,$opening-square-bracket),'[',substring(replace($date-string-without-square-brackets,'(\d{1,2}). (\d{1,2}). (\d{4})','$1\\mini$2\\mini$3'),$opening-square-bracket, $closing-square-bracket))"/> 
      </xsl:otherwise> 
     </xsl:choose> 
      </xsl:when> 
     <xsl:otherwise> 
       <xsl:value-of select="$date-string"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:function> 
+0

適切な入力、つまり適切な日付形式を持つことは可能ですか。それがなければ、間違いやすい傾向があります。 –

+0

小さなスペースでスペースを置き換えてみませんか? –

+0

私は日付を1900-01-01形式で格納し、それを使用できる属性@を持っています。不確実性は含まれていません。 – martinanton

答えて

0

最終的に再帰で解決することができました。基本的に私はそれが正規表現のddに合っているかどうかテストしています。 mm。大括弧が削除されたときのyyyy。これが動作するようになりました。今、私は文字列全体を再構築できます。

<xsl:function name="foo:date-repeat"> 
     <xsl:param name="date-string" as="xs:string"/> 
     <xsl:param name="amount" as="xs:integer"/> 
     <xsl:param name="counter" as="xs:integer"/> 
     <xsl:choose> 
     <xsl:when test="substring($date-string,$counter,1) =' '"> 
      <xsl:text>\mini</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="substring($date-string,$counter,1)"/> 
     </xsl:otherwise> 
     </xsl:choose> 
     <xsl:if test="$counter &lt;= $amount"> 
     <xsl:value-of select="foo:date-repeat($date-string, $amount,$counter+1)"/> 
     </xsl:if> 
    </xsl:function> 



<xsl:function name="foo:date-translate"> 
     <xsl:param name="date-string" as="xs:string"/> 
     <xsl:variable name="date-string-without-square-brackets" as="xs:string" select="replace(replace($date-string,'\[',''),'\]','')"/> 
     <xsl:choose> 
     <xsl:when test="matches($date-string-without-square-brackets,'\d{1,2}. \d{1,2}. \d{4}')"> 
     <xsl:choose> 
      <xsl:when test="not(contains($date-string,'['))"> <!-- Daten ohne eckige Klammer --> 
       <xsl:value-of select="replace($date-string,'(\d{1,2}). (\d{1,2}). (\d{4})','$1\\mini$2\\mini$3')"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="foo:date-repeat($date-string, string-length($date-string),1)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
      </xsl:when> 
     <xsl:otherwise> 
       <xsl:value-of select="$date-string"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:function> 

私も前には、ドットまたはドットとブラケットで、その後数またはブラケットと数であれば、今の機能のチェックは 'すべてのスペースをテストし、私の解決策を展開しています

<xsl:function name="foo:date-repeat"> 
    <xsl:param name="date-string" as="xs:string"/> 
    <xsl:param name="amount" as="xs:integer"/> 
    <xsl:param name="counter" as="xs:integer"/> 
    <xsl:choose> 
    <xsl:when test="substring($date-string,$counter,1) =' ' and ((substring($date-string,$counter -1,1) = '.' and number(substring($date-string,$counter -2,1)) = number(substring($date-string,$counter -2,1))) or (substring($date-string,$counter -2,2) = '.]' and number(substring($date-string,$counter -3,1)) = number(substring($date-string,$counter -3,1))))"> 
     <xsl:choose> 
      <xsl:when test="number(substring($date-string,$counter +1,1)) = number(substring($date-string,$counter +1,1))"> 
       <xsl:text>\mini</xsl:text> 
      </xsl:when> 
      <xsl:when test="substring($date-string,$counter +1,1) ='[' and number(substring($date-string,$counter +2,1)) = number(substring($date-string,$counter +2,1))"> 
       <xsl:text>\mini</xsl:text> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="substring($date-string,$counter,1)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:when> 
    <xsl:when test="substring($date-string,$counter,1) ='['"> 
     <xsl:text>{[}</xsl:text> 
    </xsl:when> 
    <xsl:when test="substring($date-string,$counter,1) =']'"> 
     <xsl:text>{]}</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="substring($date-string,$counter,1)"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    <xsl:if test="$counter &lt;= $amount"> 
    <xsl:value-of select="foo:date-repeat($date-string, $amount,$counter+1)"/> 
    </xsl:if>