Frage

Ich habe ein XML-Dokument, in dem die Anzahl der Dezimalstellen eine bestimmte xs:decimal in gemeldet werden sollte in einem Geschwisterknoten gehalten wird. Ich kämpfe derzeit eine einfache Möglichkeit zur Ausgabe dieser über die format-number Funktion zu finden.

Ich kann eine Bildfolge mit einigen anderen Funktionen bauen, aber dies scheint schrecklich langatmig für das, was (zumindest imo) sollte eine relativ einfache und gemeinsame Aufgabe.

z. was ich zur Zeit ist, etwas zu tun wie folgt aus:

<xsl:value-of
 select="format-number(myNode/DecimalValue,
         concat('#0.', 
                string-join(for $i in 1 to myNode/DecimalPlaces return '0'))"
/>

Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Sehr gute Frage! Das bedeutet in der Regel, ich weiß nicht, die Antwort, aber ich hoffe, dass es jemand anderes tut, da dies ein Schmerz für mich auch.

Wie auch immer, ich habe einige der Suche und ich denke, die round-half-to-even Funktion könnte den Trick ( http://www.xqueryfunctions.com/xq/fn_round-half-to-even.html )

Der Code würde:

<xsl:value-of 
  select="
    round-half-to-even(
      myNode/DecimalValue
    , myNode/DecimalPlaces
    )
  "
/>

Jetzt off für eine kleine Tangente: Für Menschen, die verwenden XSLT 1.1 oder niedriger und XPath 1, könnten Sie verwenden:

<xsl:value-of 
  select="
    concat(
      substring-before(DecimalValue, '.')
    , '.'
    , substring(substring-after(DecimalValue, '.'), 1, DecimalPlaces -1)
    , round(
        concat(
          substring(substring-after(DecimalValue, '.'), DecimalPlaces, 1)
        ,   '.'
        ,   substring(substring-after(DecimalValue, '.'), DecimalPlaces+1)
        )
      )
    )
  "
/>

Natürlich ist dieser Code schlechter als das Original, aber wenn jemand weiß, wie die ursprüngliche Frage für 1 XPath zu lösen und hat eine bessere Idee als diese, ich würde gerne das hören. (Immer öfter, ich möchte die Welt würde XML ganz übersprungen haben und bewegt sofort zu JSON)

Andere Tipps

<!-- use a generous amount of zeros in a top-level variable -->
<xsl:variable name="zeros" select="'000000000000000000000000000000000'" />

<!-- …time passes… -->
<xsl:value-of select="
  format-number(
     myNode/DecimalValue,
     concat('#0.', substring($zeros, 1, myNode/DecimalPlaces))
  )
" />

Sie können abstrakte es weg in eine Vorlage:

<!-- template mode is merely to prevent collisions with other templates -->
<xsl:template match="myNode" mode="FormatValue">
  <xsl:value-of select="
    format-number(
      DecimalValue, 
      concat('#0.', substring($zeros, 1, DecimalPlaces))
    )
  " />
</xsl:template>

<!-- call like this -->
<xsl:apply-templates select="myNode" mode="FormatValue" />

Sie können auch eine benannte Vorlage machen und den XSLT-Context-Knoten verwenden, wenn es aufgerufen wird. Hängt ein wenig auf dem Eingabedokument und muss, wenn dies für Sie möglich ist.

<xsl:template name="FormatValue">
  <!-- same as above -->
</xsl:template>

<!-- call like this -->
<xsl:for-each select="myNode">
  <xsl:call-template name="FormatValue" />
</xsl:for-each>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top