2013-05-14 15 views
2

를 사용하여 XML에서 플랫 파일 사용자 지정 순서를 필요 :그림과 같이 나는 순서로 출력 XSLT를 사용하여 XML에서 플랫 파일을 만들려면 XSLT

NM1 * CC * 1 * 스미스 * 존 *** * 34 * 999999999 ~
N3 * 100 메인 스트리트 ~이 XML에서

: 나는 아래 그림과 같이 반전 원하는 순서대로 출력을 얻을 만든 XSLT와

<Claim> 
<Claimant 
    lastName="Smith" 
    firstName="John" 
    middleName="" 
    suffixName="" 
    indentificationCodeQualifier="34" 
    identificationCode="999999999"> 
    <ClaimantStreetLocation 
     primary="100 Main Street" 
     secondary=""/> 
</Claimant> 
</Claim> 

인해의 특성 XSLT가 입력 트리를 가로지를 때 어떻게 동작하는지 가정합니다 :

N3 * 100 메인 스트리트 ~
NM1 * CC * 1 * 스미스 * 존 **** 34 * 999999999 ~

내가 변경/I가 찾고 있어요 순서를 얻기 위해 추가해야 할 내가으로 작성한 XSLT가 표시 : `

<xsl:template match="Claim/Claimant"> 
    <xsl:apply-templates /> 
    <xsl:text>NM1*CC*1*</xsl:text> 
    <xsl:value-of select="@lastName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@firstName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@middleName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@suffixName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@indentificationCodeQualifier" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@identificationCode" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template> 

<xsl:template match="Claim/Claimant/ClaimantStreetLocation"> 
    <xsl:apply-templates /> 
    <xsl:text>N3*</xsl:text> 
    <xsl:value-of select="@primary" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template>` 

하나에 두 개의 태그를 결합하지 않고 할 수있는 방법이 있나요?

의견을 보내 주시면 감사하겠습니다.

중요한지는 모르겠지만 xalan-java를 사용하여 코드에서 xslt를 처리하고 있습니다. 당신이 아이들 전에 부모를 처리 할 경우

답변

2

, 당신은 당신의 부모 템플릿의 끝 부분에 적용되는 템플릿을 이동해야합니다 :

<xsl:template match="Claim/Claimant"> 
    <xsl:text>NM1*CC*1*</xsl:text> 
    <xsl:value-of select="@lastName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@firstName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@middleName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@suffixName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@indentificationCodeQualifier" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@identificationCode" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="ClaimantStreetLocation"> 
    <xsl:apply-templates /> 
    <xsl:text>N3*</xsl:text> 
    <xsl:value-of select="@primary" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template>` 

업데이트 :은 여기에서 일어나고있는 것은 :

  1. 처리되는 첫 번째 요소는 Claim이지만 일치하는 템플릿이 없으므로 기본 템플릿이 적용되므로 하위 노드의 템플릿을 처리합니다.

  2. 첫 번째 자녀는 청구자이며 이에 해당하는 템플릿이 있으므로 적용됩니다.

  3. 다음으로 해당 템플릿이 순서대로 처리됩니다. 그러나 중요한 점은 apply-templates가 기본 선택 ( What is the default select of XSLT apply-templates? 참조)의 속성을 생략하므로 ClaimantStreetLocation 요소 만 일치하는 노드입니다.

  4. ClaimantStreetLocation과 일치하는 템플릿이 있으면이 템플릿이 적용됩니다. 따라서 속성을 먼저 처리하려면 적용 템플리트를 수동으로 선택하기 전까지 지연시켜야합니다.

+1

슈레 인! 그게 효과가 있었어. 하지만 를 부모의 맨 아래로 이동시키는 방법은 부모가 먼저 실행되도록하는 방법입니다. ClaimantStreetLocation 템플릿 다음에 줄이 필요하면이 태그의 이름을 지정해야합니까? – user2382922

+0

답변에 대한 설명이 추가되었습니다. 희망이 도움이됩니다. – Shrein

+0

그건 의미가 있습니다. 설명 Shrein 주셔서 감사합니다! – user2382922