2012-02-08 17 views
1

私はhtmlからXMLに変換するプロセスに参加していますが、すべてうまくいきますが、元のパス構造を新しい構造に変換するのに少し苦労しています。例以下は部分文字列の操作

は私が達成したいものを説明します

私は(単純化した例)今持っているもの:

<links> 
<link>somefile.png</link> 
<link>some_other_file.gif</link> 
<link>yet_another_file.jpg</link> 
</links> 

や他の言葉では:私が取得したいと何

<links> 
<link>../../../folder1/folder2/folder3/folder4/somefile.png</link> 
<link>../../../foldera/folderb/folder/some_other_file.gif</link> 
<link>folder_x/yet_another_file.jpg</link> 
</links> 

xslt(2)を使ってテキスト内の最後の "/"の後の文字列を取得する最も簡単な方法は何ですか?

これに関するアドバイスありがとう!

答えて

3

に加えて、勿論、例えば、

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* , node()"/> 
    </xsl:copy> 
</xsl:template> 
0

編集:これはあなたがこれを達成するためにsubstring-after機能を使用することができ、コメント

を参照し、動作しません。 linkノードを反復処理し、パスが

<xsl:variable name="lastPart" select="substring-after(text(.), '/')"/> 

$lastPartになり、今文字列の最後の/の右側にあるものは何でも含まれています。そのような文字がない場合、これは空の文字列を返します。そのために余分なチェックを行う必要があります。

+0

より良いあなたの参照をチェック... http://www.w3.org/TR/xpath/#function-substring-after – LarsH

+0

「サブ-後の機能は、次の最初の引数文字列の部分文字列を返します。 **第2引数文字列の**最初の出現** ... " – LarsH

+0

あなたは正しいです。私はそれを誤解した。エラーを編集して間違いを反映させます – Dervall

1

は、これも当然の追加の名前空間宣言を、必要と

<xsl:output method="text"/> 

<xsl:function name="xfn:substringAfterLast"> 
    <xsl:param name="arg"/> 
    <xsl:param name="delim"/> 

    <xsl:sequence select="replace ($arg,concat('^.*',xfn:escapeForRegex($delim)),'')"/> 
</xsl:function> 

<xsl:function name="xfn:escapeForRegex" >    
    <xsl:param name="arg"/> 
    <xsl:sequence select="replace($arg, '(\.|\[|\]|\\|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1')"/> 
</xsl:function> 

<xsl:template match="/"> 
    <xsl:value-of select="xfn:substringAfterLast('../../../folder1/folder2/folder3/folder4/somefile.png', '/')"/> 
    <xsl:apply-templates/> 
</xsl:template> 

を使用してみてください。

+0

+1 - 面白いが複雑なアプローチ。 – LarsH

+1

合意しました:-) Martin Honnenによって提案されたtokenizeソリューションをもっとうまく活用しましょう! – Maestro13