XSLT 1.0에서 24 시간 시간을 서식하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/142400

  •  02-07-2019
  •  | 
  •  

문제

시간 형식을 취하는 좋은 방법을 찾는 데 어려움을 겪고 시간 형식을 취하고 유효한지를 쉽게 결정한 다음 XSLT 1.0을 사용하여 일부 형식을 갖는 결과 요소를 생성하는 데 쉽게 결정했습니다.

다음 XML이 주어지면 :

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

결과 XML을 생성하는 것이 좋을 것입니다.

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

그러나 소스 XML에 무효 24 시간 시간 형식이 포함 된 경우 결과 dsttime 요소는 비어 있어야합니다.

예를 들어, 유효하지 않은 소스 XML이 다음과 같은 경우.

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

결과 XML은 다음과 같습니다.

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

문제는 무엇입니까 최고의 XSLT 1.0 원하는 결과를 생성하기 위해 작성할 수있는 조각? 희망은 그것을 아주 단순하게 유지하고 시간의 모든 부분을 구문 분석 할 필요가 없다는 것입니다 (즉, 패턴 일치는 가능하면 달콤합니다).

도움이 되었습니까?

해결책

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>

다른 팁

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

간단한 구문 분석 및 서식 기능을 작성해야합니다. 그것은 단순하지 않을 것이며, 그것은 예쁘지 않을 것입니다.

XSLT는 실제로 나무 변형을 위해 설계되었습니다. 이러한 종류의 텍스트 노드 조작은 XSLT 외부에서 가장 잘 수행됩니다.

사용 된 실제 XSLT 프로세서에 따라 사용자 정의 확장 기능 (직접 만들어야 함)에서 원하는 작업을 수행 할 수 있습니다.

Xalan은 잘 지원합니다 확장 기능, 당신은 자바뿐만 아니라 JavaScript 또는 기타 언어로도 쓸 수 있습니다. 아파치 BSF.

Microsoft의 XSLT 엔진은 다음과 같은 사용자 정의 확장을 지원합니다. .NET Framework Developer 's Guide, XSLT 스타일 시트 확장

다음을 살펴보십시오.http://www.exslt.org/ 특히 "날짜와 시간"섹션. 나는 그것에 깊이 파고 들지 않았지만 그것이 당신이 찾고있는 것 같습니다.

exslt.org time () 함수조차도 입력이 적절한 형식 (xs : dateTime 또는 Xs : time)이 될 것으로 기대하기 때문에 여기서는 도움이되지 않습니다.

이것은 XSLT 외부에서 가장 잘 고정 된 것입니다. 나는 이것을 일상적으로 XSLT를 사용하여 실제로 설계되지 않은 일을하고 일을 할 수 있도록 관리하는 사람으로 말합니다. 그것은 진짜 문자열을 구문 분석하도록 설계되지 않았습니다.

이상적인 솔루션은 XML 문서를 생성하는 모든 것을 수정하여 해당 목적을 위해 편리하게 설정된 국제 표준을 사용하여 시간을 형식화하여 피할 수있는 경우 쓰레기 데이터를 지속하거나 전송하지 말아야 할 원칙을 사용하여 시간을 형식화하는 것입니다.

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

그리고 목록을 완성하려면 날짜/시간 처리 모듈 Steve Ball의 XSLT 표준 라이브러리의 일부.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top