2014-06-20 3 views
0

나는 긴 태그 목록을 가진 XML 코드를 가지고 있으며, 모든 요소 "text"에서 내부 단어와 태그를 각각의 "form"속성 값으로 대체하려고합니다.속성 값을 기준으로 요소/태그 값을 변경하는 방법은 무엇입니까?

내가 찾고 있어요 출력
<messages> 
    <text> 
     <spelling form="Hello">Helo</spelling> I'll see you next <abrev form="week">wk</abrev> alright. 
    </text> 
    <text> 
     <abrev form="Come on">cmon</abrev> get ready <spelling form="dude">dood</spelling>! 
    </text> 
</messages> 

은 다음과 같습니다 :

Hello I'll see you next week alright. 
Come on get ready dude! 

누구 아이디어가 있습니까 방법이 작업을 수행하는

예를 들어, 여기 내 XML 파일에서이 개 문장입니까?

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

    <xsl:for-each select="messages/text"> 

     <xsl:call-template name="parse"> 

      <!-- this selects all the tags inside "text" (I think...) --> 
      <xsl:with-param name="a" select="./*"/> 

     </xsl:call-template> 

    </xsl:for-each> 
</xsl:template> 

그런 다음, 제 기능을 "구문 분석":

<xsl:template name="parse"> 

    <!-- "a" is the text to parse --> 
    <xsl:param name="a"/> 

    <!-- return the value of "form" --> 
    <xsl:value-of select="$a/@form"/> 

</xsl:template> 
이제

, 내 함수는 "분석"ISN 여기


내가 내 XSL 파일에 지금까지 무엇을 가지고 완료되지 않았습니다. 철자가 틀린 단어를 "양식"값으로 바꾸는 방법을 모르겠습니다.

도움 주셔서 감사합니다.

+0

''및 ''또는 둘 중 하나만 사용합니까? 그들은 당신의 근원에서 정확하게 닫히지 않습니다. – helderdarocha

답변

1

당신이 당신의 텍스트를 모두 <abrev> 또는 <spelling> 요소 (A form 속성 실제로 하나)를 가질 수 가정하고 실제 XML이 잘 형성되고,이 스타일은 가치와 태그 텍스트를 대체 할 수 이 입력에 적용 할 경우

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

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="messages/text"/> 
    </xsl:template> 

    <xsl:template match="text/*[@form]"> 
     <xsl:value-of select="@form"/> 
    </xsl:template> 
</xsl:stylesheet> 

: 다음 form 속성은

0 :

<messages> 
    <text> 
     <spelling form="Hello">Helo</spelling> I'll see you next <abrev form="week">wk</abrev> alright. 
    </text> 
    <text> 
     <spelling form="Come on">cmon</spelling> get ready <abrev form="dude">dood</abrev>! 
    </text> 
</messages> 

당신은 출력으로이 얻을 것이다

Hello I'll see you next week alright. 

    Come on get ready dude! 
+0

고마워, 너 최고야! – Nicolas

1

정체성 템플릿으로 시작하여 각 요소에 대한 템플릿을 만들어 특정 출력을 제어 할 수 있습니다. 예를 들어 text 요소의 텍스트를 spellingabrev 요소의 템플릿 실행과 함께 출력하여 @form 특성을 출력합니다.

그래서 아래처럼 보일 것입니다.

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

    <xsl:template match="messages"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="text"> 
    <xsl:apply-templates select="*|text()"/> 
    </xsl:template> 

    <xsl:template match="spelling"> 
    <xsl:value-of select="@form"/> 
    </xsl:template> 

    <xsl:template match="abrev"> 
    <xsl:value-of select="@form"/> 
    </xsl:template> 
+0

중복을 제거하기 위해''를 사용할 수도 있습니다. – helderdarocha

+1

@helderdarocha 그래, 네가 그 대답을보기 전까지 나는 그것을 완전히 놓쳤다. 우리의 대답 사이에서 그들은 그것으로 무엇을하고 싶은지를 알아낼 수 있어야합니다. –

관련 문제