Frage

Ich habe eine harte Zeit zu finden gute Möglichkeiten habe ein Zeitformat zu nehmen und die Bestimmung leicht, wenn es gültig ist dann ein resultierendes Element erzeugen, die einige Formatierungen 1.0 mit XSLT hat.

In Anbetracht der folgenden xml:

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

Es wäre toll, das resultierende xml zu erzeugen:

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

Wenn jedoch die Quelle xml ein ungültiges Zeitformat 24 Stunde enthält, die resultierende dstTime -Element sollte leer sein.

Zum Beispiel, wenn die ungültige XML-Quell ist die folgende:

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

Das resultierende xml sollte sein:

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

Die Frage ist, was ist das beste XSLT 1.0 Fragment, das geschrieben werden, um die gewünschten Ergebnisse zu produzieren? Die Hoffnung wäre, es zu halten ganz einfach und nicht jedes Stück der Zeit zu analysieren hat (das heißt Pattern-Matching süß wäre, wenn möglich).

War es hilfreich?

Lösung

Es gibt keine regulären Ausdrücken in XSLT 1.0, so fürchte ich, dass Mustervergleich wird nicht möglich sein.

Ich bin mir nicht klar, ob <srcTime>23:00</srcTime> legal sein soll oder nicht? Wenn ja, versuchen Sie:

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

Wenn es nicht ist, und vier Ziffern ist die einzige Sache, die dann legal ist:

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

Andere Tipps

XSLT 1.0 hat keinen Standard-Support für Datum / Zeit-Manipulation.

Sie müssen eine einfache Analyse und Formatierungsfunktion schreiben. Das wird nicht einfach sein, und das ist nicht schön sein wird.

XSLT ist wirklich für Baum-Transformationen entwickelt. Diese Art von Textknoten Manipulationen am besten außerhalb von XSLT erfolgen.

auf dem tatsächlichen XSLT-Prozessor Je verwendet werden, könnten Sie in der Lage sein, die gewünschten Operationen in benutzerdefinierte Erweiterungsfunktion zu tun (die Sie selbst machen müsste).

Xalan hat eine gute Unterstützung für Funktionen Erweiterung , können Sie sie schreiben kann nicht nur in Java, sondern auch in JavaScript oder andere von Apache BSF .

Microsofts XSLT-Engine unterstützt auch kundenspezifische Erweiterungen, wie in der .NET Framework Entwicklerhandbuch, Erweitern von XSLT-Stylesheets

Haben Sie einen Blick auf: http://www.exslt.org/ speziell die "Daten und Zeiten" Abschnitt. Ich habe gegraben nicht tief hinein, aber es sieht aus wie es sein kann, was Sie suchen.

Auch die exslt.org time () Funktion werden Ihnen hier nicht helfen, weil es seine Eingabe erwartet in dem richtigen Format zu sein (xs: datetime oder xs: time).

Dies ist etwas, das außerhalb von XSLT am besten festgelegt ist. Das sage ich als jemand, der XSLT routinemäßig verwendet, Dinge zu tun, es ist nicht wirklich entworfen für wurde und verwaltet Arbeits Dinge zu bekommen. Es war wirklich nicht darauf ausgelegt, Strings parsen.

Die ideale Lösung ist zu beheben, was auch immer das XML-Dokument erzeugt, so dass es mal formatiert nur den internationalen Standard bequem eingerichtet mit zu diesem Zweck das Prinzip, dass Sie nicht Mist Daten bestehen bleiben oder übertragen soll, wenn Sie dies tun, vermeiden können .

Aber wenn das nicht möglich ist, sollten Sie die Daten entweder beheben, bevor es zu XSLT vorbei oder es zu beheben, nachdem der Transformation der Ausgabe zu erzeugen.

Und die Liste komplett zu haben, gibt es auch Datum / Zeit-Verarbeitungsmodul Teil der XSLT-Standardbibliothek von Steve Ball.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top