XSL

2012-11-07 3 views
0

을 사용하여 XML의 요소를 검사하십시오. 따라서 웹 서비스를 통해 전송되기 전에 XSL을 사용하여 날짜를 형식화하려고하지만 DOB 필드가 비어 있으면 해당 필드가 비어 있는지 확인하십시오. 그 안에 날짜가 있으면 날짜 형식으로 진행됩니다.XSL

은 이제 날짜를 포맷하는 XSL을 가지고있다 - 그러나 나는 작업 상태를 얻이 수없는 것 자사 비워두면 그것을 XSL을 통해 이동하기 전에 빈

XML :

<BriefDetails> 
    <ObjectID> 
     <flt:ObjectType>C1</flt:ObjectType> 
    </ObjectID> 
</BriefDetails> 
<Name> 
    <Title>Dr</Title> 
    <Forename>Paul</Forename> 
    <Surname>Smith</Surname> 
    <flt:Preferred>true</flt:Preferred> 
</Name> 
<ContactEmails> 
    <EmailAddress>[email protected]</EmailAddress> 
    <flt:Preferred>true</flt:Preferred> 
</ContactEmails> 
<DateOfBirth /> 
<ContactPostals> 
    <AddressNumber>34</AddressNumber> 
    <AddressLine>Hopeless Road</AddressLine> 
    <AddressLine>Maghera</AddressLine> 
    <Postcode>BT74 2TY</Postcode> 
    <flt:Preferred>true</flt:Preferred> 
</ContactPostals> 
<ContactPhones> 
    <Number>5545454</Number> 
    <flt:Preferred>false</flt:Preferred> 
</ContactPhones> 
<ContactPhones> 
    <Number>5454545</Number> 
    <flt:Preferred>false</flt:Preferred> 
</ContactPhones> 

XSL 후 XML : 당신이 위

<BriefDetails> 
    <ObjectID> 
     <flt:ObjectType>C1</flt:ObjectType> 
    </ObjectID> 
</BriefDetails> 
<Name> 
    <Title>Dr</Title> 
    <Forename>Paul</Forename> 
    <Surname>Smith</Surname> 
    <flt:Preferred>true</flt:Preferred> 
</Name> 
<ContactEmails> 
    <EmailAddress>[email protected]</EmailAddress> 
    <flt:Preferred>true</flt:Preferred> 
</ContactEmails> 
***<DateOfBirth>--</DateOfBirth>*** 
<ContactPostals> 
    <AddressNumber>34</AddressNumber> 
    <AddressLine>Hopeless Road</AddressLine> 
    <AddressLine>Maghera</AddressLine> 
    <Postcode>BT74 2TY</Postcode> 
    <flt:Preferred>true</flt:Preferred> 
</ContactPostals> 
<ContactPhones> 
    <Number>5545454</Number> 
    <flt:Preferred>false</flt:Preferred> 
</ContactPhones> 
<ContactPhones> 
    <Number>5454545</Number> 
    <flt:Preferred>false</flt:Preferred> 
</ContactPhones> 

이 같은 DOB을 볼 수 -

<xsl:template match="DateOfBirth"> 
    <xsl:element name="DateOfBirth"> 
     <xsl:call-template name="formatDate"> 
      <xsl:with-param name="dateParam" select="." /> 
     </xsl:call-template> 
    </xsl:element> 
</xsl:template> 

<xsl:template name="formatDate"> 
    <xsl:param name="dateParam" /> 
    <!-- input format mm/dd/yyyy or m/d/yyyy --> 
    <!-- output format yyyy-mm-dd --> 

    <!-- parse out the day, month and year --> 
    <xsl:variable name="day"> 
     <xsl:value-of select="substring-before($dateParam,'/')" /> 
    </xsl:variable> 
    <xsl:variable name="month"> 
     <xsl:value-of select="substring-before(substring-after($dateParam,'/'),'/')" /> 
    </xsl:variable> 
    <xsl:variable name="year"> 
     <xsl:value-of select="substring-after(substring-after($dateParam,'/'),'/')" /> 
    </xsl:variable> 

    <!-- now print them out. Pad with 0 where necessary. --> 
    <xsl:value-of select="$year" /> 
    <xsl:value-of select="'-'" /> 
    <xsl:if test="string-length($month) = 1"> 
     <xsl:value-of select="'0'" /> 
    </xsl:if> 
    <xsl:value-of select="$month" /> 
    <xsl:value-of select="'-'" /> 
    <xsl:if test="string-length($day) = 1"> 
     <xsl:value-of select="'0'" /> 
    </xsl:if> 
    <xsl:value-of select="$day" /> 
</xsl:template> 

내가 조건에 추가 시도 : XSL 사용중인

<xsl:template match="DateOfBirth"> 
    <xsl:for-each select="DateOfBirth"> 
     <xsl:if test="string-length(DateOfBirth) != 0"> 
      <xsl:call-template name="formatDate"> 
       <xsl:with-param name="dateParam" select="DateOfBirth" /> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template name="formatDate"> 
    <xsl:param name="dateParam" /> 
    <!-- input format mm/dd/yyyy or m/d/yyyy --> 
    <!-- output format yyyy-mm-dd --> 

    <!-- parse out the day, month and year --> 
    <xsl:variable name="day"> 
     <xsl:value-of select="substring-before($dateParam,'/')" /> 
    </xsl:variable> 
    <xsl:variable name="month"> 
     <xsl:value-of select="substring-before(substring-after($dateParam,'/'),'/')" /> 
    </xsl:variable> 
    <xsl:variable name="year"> 
     <xsl:value-of select="substring-after(substring-after($dateParam,'/'),'/')" /> 
    </xsl:variable> 

    <!-- now print them out. Pad with 0 where necessary. --> 
    <xsl:value-of select="$year" /> 
    <xsl:value-of select="'-'" /> 
    <xsl:if test="string-length($month) = 1"> 
     <xsl:value-of select="'0'" /> 
    </xsl:if> 
    <xsl:value-of select="$month" /> 
    <xsl:value-of select="'-'" /> 
    <xsl:if test="string-length($day) = 1"> 
     <xsl:value-of select="'0'" /> 
    </xsl:if> 
    <xsl:value-of select="$day" /> 
</xsl:template> 

하지만 이제 XML

에 내가 이것을 달성 할 수있는 방법에 대한 조언을 DOB을 제거합니다?

답변

2

문제는 당신의 IF 조건

<xsl:if test="string-length(DateOfBirth) != 0"> 

이미이 시점에서 생년월일 (DateOfBirth) 요소에 위치와 함께, 그래서이 사실은 자식 요소를 찾고있다가 현재 요소에 생년월일 (DateOfBirth)라고, 현재 요소 자체의 값보다는

<xsl:if test="string-length(.) != 0"> 

사실, 당신은 또한 불필요한 XSL을 추가 한 것 : 대한-각도. 다만 직접 요소를 쓰는 요소를 정적 요소 이름 : 귀하의 템플릿 정말 보조 노트로이

<xsl:template match="DateOfBirth"> 
    <DateOfBirth> 
     <xsl:if test="string-length(.) != 0"> 
      <xsl:call-template name="formatDate"> 
       <xsl:with-param name="dateParam" select="." /> 
      </xsl:call-template> 
     </xsl:if> 
    </DateOfBirth> 
</xsl:template> 

같이한다 XSL을 사용하기위한 필요가 없다.

xsl : if의 필요없이 실제로이 작업을 수행 할 수있는 또 다른 방법이 있습니다. 당신은 생년월일 (DateOfBirth)가 비어있을 때 두 번째 템플릿 만 일치 할 수 있도록

<xsl:template match="DateOfBirth[string-length(.) != 0]"> 
    <DateOfBirth> 
     <xsl:call-template name="formatDate"> 
      <xsl:with-param name="dateParam" select="." /> 
     </xsl:call-template> 
    </DateOfBirth> 
</xsl:template> 

<xsl:template match="DateOfBirth"> 
    <DateOfBirth /> 
</xsl:template> 

XSLT는 먼저보다 구체적인 템플릿을 일치 템플릿 경기 내에서 조건을 가질 수 있습니다. 더 나아가, XSLT에서 ID 변환을 사용했다면 실제로 두 번째 템플릿이 전혀 필요하지 않습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 이것은 내가 필요한 것을 거의 다룬다. 비록 날짜가 공백이면 오류가 표시된다고해도 문제는 여전히 남아 있지만 XML에서 DOB가 제거되지 않은 것을 볼 수있다. DOB가 예상되면 WS에 로직을 적용해야한다고 생각합니다. DOB가 비어 있으면 WS에 포함되지 않은 논리를 적용합니다. – user1800502