Pergunta

Eu tive um tempo difícil encontrar boas maneiras de tomar um formato de hora e facilmente determinar se ele é válido, então produzindo um elemento resultante que tem alguma formatação usando XSLT 1.0.

Dado o seguinte xml:

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

Seria ótimo para produzir o XML resultante:

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

No entanto, se a origem XML contém um formato de hora inválida 24 horas, o que resulta dstTime elemento deve estar em branco.

Por exemplo, quando a fonte de XML inválido é o seguinte:

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

O XML resultante deve ser:

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

A questão é, qual é o melhor XSLT 1.0 fragmento que poderia ser escrito para produzir os resultados desejados? A esperança seria mantê-lo bastante simples e não tem que analisar a cada pedaço do tempo (ou seja, padrão de correspondência seria doce se possível).

Foi útil?

Solução

Não existem expressões regulares em XSLT 1.0, por isso estou com medo de que a correspondência de padrão não vai ser possível.

Eu não sou claro se <srcTime>23:00</srcTime> é suposto ser legal ou não? Se for, tente:

<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>

Se não é, e quatro dígitos é a única coisa que é legal, em seguida:

<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>

Outras dicas

XSLT 1.0 não tem qualquer suporte padrão para data / manipulação do tempo.

Você deve escrever uma simples análise e formatação de função. Isso não vai ser simples, e que não vai ser bonito.

XSLT é realmente concebido para transformações de árvores. Este tipo de manipulações nó de texto são melhor fora feito de XSLT.

Dependendo do processador XSLT real usado você pode ser capaz de fazer operações desejadas em função de extensão personalizada (que você tem que se fazer).

Xalan tem um bom suporte para funções de extensão , você pode escrever-lhes que não apenas em Java, mas também em JavaScript ou outros idiomas suportados pelo Apache BSF .

motor XSLT da Microsoft suporta extensões personalizadas, bem como, conforme descrito no .NET Framework Guia do desenvolvedor, estendendo Sheets XSLT Estilo

Tenha um olhar em: http://www.exslt.org/ especificamente o "datas e horas" seção. Eu não cavou fundo para ele, mas parece que ele pode ser o que você está procurando.

Mesmo o tempo exslt.org () função não irá ajudá-lo aqui, porque ele espera que sua entrada seja no formato adequado (xs: dateTime ou xs: tempo).

Isso é algo que é melhor fora de XSLT fixo. Digo isso como alguém que rotineiramente utiliza XSLT para fazer coisas que não foi realmente concebido para e consegue fazer as coisas funcionarem. Foi realmente não foi concebido para cordas de análise.

A solução ideal é corrigir o que está produzindo o documento XML para que ele formata vezes usando o padrão internacional convenientemente estabelecida apenas para essa finalidade, utilizando o princípio de que você não deve persistir ou de transmissão de dados porcaria se você pode evitar fazê-lo .

Mas se isso não for possível, você deve ou corrigir os dados antes de passá-la para XSLT ou corrigi-lo depois de gerar o da saída de transformar.

E ter a completa lista, há também Data / Hora módulo de processamento de parte da biblioteca padrão XSLT por Steve Ball.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top