2012-02-08 4 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

이제 문자열의 마지막 /의 오른쪽에 무엇이든 포함됩니다. 그러한 캐릭터가 존재하지 않는 경우, 빈 상태 (empty)의 캐릭터 라인이 돌려 주어집니다. 그 때문에, 여분의 체크를 실시 할 필요가 있습니다.

+0

더 나은 귀하의 참조를 확인 ... http://www.w3.org/TR/xpath/#function-substring-after – LarsH

+0

"하위 문자열-후 기능은 다음 첫 번째 인수 문자열의 하위 문자열을 반환 ** 두 번째 인수 문자열의 ** 첫 번째 발생 ** " – 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이 제안한 토큰 화 솔루션을 사용하는 것이 더 좋습니다! – Maestro13