2008-09-26 5 views
2

나는 시간 형식을 취하고 XSLT 1.0을 사용하여 형식이 지정된 결과 요소를 생성하는 것이 유효한 지 쉽게 결정하는 데 어려움을 겪었습니다.XSLT 1.0에서 24 시간 형식을 포맷하는 가장 좋은 방법은 무엇입니까?

주어진 다음의 XML : 다운 를 결과, 소스 XML 잘못된 24 시간 시간 형식을 포함하는 경우, 그러나

<root> 
    <dstTime>23:00</dstTime> 
</root> 

:

<root> 
    <srcTime>2300</srcTime> 
</root> 

결과 XML을 생성하는 좋은 것 dstTime 요소는 비워 두어야합니다.

<root> 
    <srcTime>NOON</srcTime> 
</root> 

결과 XML은 다음과 같아야합니다 : 유효하지 않은 소스 XML은 다음과 같은 예를 들어

, 질문은

<root> 
    <dstTime></dstTime> 
</root> 

, 무슨 일이 할 수 있었던 최고의 XSLT 1.0 조각입니다 원하는 결과를 얻기 위해 작성해야합니까? 희망 사항은 매우 단순하게 유지하고 모든 시간을 구문 분석 할 필요가 없다는 것입니다 (즉, 가능한 경우 패턴 매칭이 좋을 것입니다).

+0

2400이 유효하지 않은 날짜임을 알 수 있습니다. 정오는 1200이고 자정은 0000입니다. – dacracot

+0

어떤 XSLT 엔진을 사용하고 있습니까? – Kev

+0

잘못된 시간을 지적 해 주셔서 감사합니다. 웁스! 이후 수정되었습니다. –

답변

5

XSLT 1.0에는 정규식이 없으므로 패턴 일치가 불가능할 것 같습니다.

<srcTime>23:00</srcTime>이 (가) 유효한 것인지 아닌지 확실하지 않습니다.그렇지 않은 경우

<dstTime> 
    <xsl:if test="string-length(srcTime) = 4 or 
       string-length(srcTime) = 5"> 
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" /> 
    <xsl:if test="$hour >= 0 and 24 > $hour"> 
     <xsl:variable name="minute"> 
     <xsl:choose> 
      <xsl:when test="string-length(srcTime) = 5 and 
          substring(srcTime, 3, 1) = ':'"> 
      <xsl:value-of select="substring(srcTime, 4, 2)" /> 
      </xsl:when> 
      <xsl:when test="string-length(srcTime) = 4"> 
      <xsl:value-of select="substring(srcTime, 3, 2)" /> 
      </xsl:when> 
     </xsl:choose> 
     </xsl:variable> 
     <xsl:if test="$minute >= 0 and 60 > $minute"> 
     <xsl:value-of select="concat($hour, ':', $minute)" /> 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</dstTime> 

를, 4 개 자리는 법적 다음의 유일한입니다 :이 경우, 시도

<dstTime> 
    <xsl:if test="string-length(srcTime) = 4"> 
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" /> 
    <xsl:if test="$hour >= 0 and 24 > $hour"> 
     <xsl:variable name="minute" select="substring(srcTime, 3, 2)" /> 
     <xsl:if test="$minute >= 0 and 60 > $minute"> 
     <xsl:value-of select="concat($hour, ':', $minute)" /> 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</dstTime> 
3

XSLT 1.0에는 날짜/시간 조작에 대한 표준 지원이 없습니다.

간단한 구문 분석 및 서식 지정 기능을 작성해야합니다. 그것은 단순하지 않을 것이며, 그것은 꽤 될 수 없습니다.

XSLT는 실제로 트리 변환을 위해 설계되었습니다. 이러한 종류의 텍스트 노드 조작은 XSLT 외부에서 수행하는 것이 가장 좋습니다.

1

다음을보십시오 : http://www.exslt.org/ "날짜 및 시간"섹션. 나는 그것에 깊이 파고 들지 않았지만 그것이 당신의 무엇을 찾고있는 것처럼 보입니다.

1

exslt.org time() 함수도 올바른 형식 (xs : dateTime 또는 xs : time)으로 입력되기를 기대하기 때문에 여기서는 도움이되지 않습니다.

이것은 XSLT 외부에서 가장 잘 고정되어 있습니다. XSLT를 사용하여 일상적으로 실제로 설계되지 않은 작업을 수행하고 일을 처리하는 사람으로 말합니다. 은 실제로 문자열을 구문 분석하도록 설계되지 않았습니다.

이상적인 솔루션은 XML 문서를 생성하는 모든 부분을 수정하여 해당 목적을 위해 편리하게 설정된 국제 표준을 사용하여 시간을 형식화하는 것입니다. 수행하지 않을 경우 허위 데이터를 유지하거나 전송하면 안됩니다. 그래서.

그러나 가능하지 않은 경우 데이터를 XSLT로 전달하기 전에 수정하거나 변형 출력을 생성 한 후에 수정해야합니다.

1

그리고 완전한 목록을 가지고에 설명 된대로

마이크로 소프트의 XSLT 엔진뿐만 아니라, 사용자 정의 확장을 지원, 또한 스티브 공에 의해 XSLT 표준 라이브러리의 Date/Time processing module 부분이있다.

관련 문제