/ .. / / -> download
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:param name="format">SI</xsl:param>

  <xsl:template match="uomDisplay">
    <xsl:variable name="selected-format" select="format[@name = $format]"/>
    <xsl:element name="xsl:stylesheet">
      <xsl:attribute name="version">1.0</xsl:attribute>
      <xsl:element name="xsl:decimal-format">
        <xsl:attribute name="name">decimal-format</xsl:attribute>
        <xsl:attribute name="decimal-separator">
          <xsl:value-of select="$selected-format/@decimalSeparator"/>
        </xsl:attribute>
        <xsl:attribute name="grouping-separator">
          <xsl:value-of select="$selected-format/@groupingSeparator"/>
        </xsl:attribute>
      </xsl:element>
      <xsl:element name="xsl:variable">
        <xsl:attribute name="name">decimal-separator</xsl:attribute>
        <xsl:element name="xsl:text">
          <xsl:value-of select="$selected-format/@decimalSeparator"/>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:variable">
        <xsl:attribute name="name">grouping-separator</xsl:attribute>
        <xsl:element name="xsl:text">
          <xsl:value-of select="$selected-format/@groupingSeparator"/>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">@*|node()</xsl:attribute>
        <xsl:element name="xsl:copy">
          <xsl:element name="xsl:apply-templates">
            <xsl:attribute name="select">@*|node()</xsl:attribute>
          </xsl:element>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="name">repeat-string</xsl:attribute>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">string</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">count</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">group</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">separator</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:if">
          <xsl:attribute name="test">$count > 0</xsl:attribute>
          <xsl:element name="xsl:value-of">
            <xsl:attribute name="select">$string</xsl:attribute>
          </xsl:element>
          <xsl:element name="xsl:if">
            <xsl:attribute name="test">$group and $count > 1 and $count mod $group = 1</xsl:attribute>
            <xsl:element name="xsl:value-of">
              <xsl:attribute name="select">$separator</xsl:attribute>
            </xsl:element>
          </xsl:element>
          <xsl:element name="xsl:call-template">
            <xsl:attribute name="name">repeat-string</xsl:attribute>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">string</xsl:attribute>
              <xsl:attribute name="select">$string</xsl:attribute>
            </xsl:element>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">count</xsl:attribute>
              <xsl:attribute name="select">$count - 1</xsl:attribute>
            </xsl:element>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">group</xsl:attribute>
              <xsl:attribute name="select">$group</xsl:attribute>
            </xsl:element>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">separator</xsl:attribute>
              <xsl:attribute name="select">$separator</xsl:attribute>
            </xsl:element>
          </xsl:element>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="name">generate-number-format</xsl:attribute>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">value</xsl:attribute>
          <xsl:attribute name="select">.</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:variable">
          <xsl:attribute name="name">abs</xsl:attribute>
          <xsl:element name="xsl:choose">
            <xsl:element name="xsl:when">
              <xsl:attribute name="test">starts-with($value, '-')</xsl:attribute>
              <xsl:element name="xsl:value-of">
                <xsl:attribute name="select">substring-after($value, '-')</xsl:attribute>
              </xsl:element>
            </xsl:element>
            <xsl:element name="xsl:otherwise">
              <xsl:element name="xsl:value-of">
                <xsl:attribute name="select">$value</xsl:attribute>
              </xsl:element>
            </xsl:element>
          </xsl:element>
        </xsl:element>
        <xsl:element name="xsl:variable">
          <xsl:attribute name="name">has-decimal</xsl:attribute>
          <xsl:attribute name="select">contains($abs, '.')</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:call-template">
          <xsl:attribute name="name">repeat-string</xsl:attribute>
          <xsl:element name="xsl:with-param">
            <xsl:attribute name="name">string</xsl:attribute>
            <xsl:text>0</xsl:text>
          </xsl:element>
          <xsl:element name="xsl:with-param">
            <xsl:attribute name="name">count</xsl:attribute>
            <xsl:element name="xsl:choose">
              <xsl:element name="xsl:when">
                <xsl:attribute name="test">$has-decimal</xsl:attribute>
                <xsl:element name="xsl:value-of">
                  <xsl:attribute name="select">string-length(substring-before($abs, '.'))</xsl:attribute>
                </xsl:element>
              </xsl:element>
              <xsl:element name="xsl:otherwise">
                <xsl:element name="xsl:value-of">
                  <xsl:attribute name="select">string-length($abs)</xsl:attribute>
                </xsl:element>
              </xsl:element>
            </xsl:element>
          </xsl:element>
          <xsl:element name="xsl:with-param">
            <xsl:attribute name="name">group</xsl:attribute>
            <xsl:text>3</xsl:text>
          </xsl:element>
          <xsl:element name="xsl:with-param">
            <xsl:attribute name="name">separator</xsl:attribute>
            <xsl:element name="xsl:value-of">
              <xsl:attribute name="select">$grouping-separator</xsl:attribute>
            </xsl:element>
          </xsl:element>
        </xsl:element>
        <xsl:element name="xsl:if">
          <xsl:attribute name="test">$has-decimal</xsl:attribute>
          <xsl:element name="xsl:value-of">
            <xsl:attribute name="select">$decimal-separator</xsl:attribute>
          </xsl:element>
          <xsl:element name="xsl:call-template">
            <xsl:attribute name="name">repeat-string</xsl:attribute>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">string</xsl:attribute>
              <xsl:text>0</xsl:text>
            </xsl:element>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">count</xsl:attribute>
              <xsl:attribute name="select">string-length(substring-after($value, '.'))</xsl:attribute>
            </xsl:element>
          </xsl:element>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="name">format-quantity-value</xsl:attribute>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">value</xsl:attribute>
          <xsl:attribute name="select">.</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:variable">
          <xsl:attribute name="name">format</xsl:attribute>
          <xsl:element name="xsl:call-template">
            <xsl:attribute name="name">generate-number-format</xsl:attribute>
            <xsl:element name="xsl:with-param">
              <xsl:attribute name="name">value</xsl:attribute>
              <xsl:attribute name="select">$value</xsl:attribute>
            </xsl:element>
          </xsl:element>
        </xsl:element>
        <xsl:element name="xsl:value-of">
          <xsl:attribute name="select">format-number($value, $format, 'decimal-format')</xsl:attribute>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">quantity</xsl:attribute>
        <xsl:choose>
          <xsl:when test="wrapInto/*">
            <xsl:apply-templates select="wrapInto/*"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:call-template name="quantity"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">quantityGroup</xsl:attribute>
        <xsl:element name="xsl:choose">
          <xsl:element name="xsl:when">
            <xsl:attribute name="test">@quantityGroupType = 'minimum'</xsl:attribute>
            <xsl:element name="xsl:choose">
              <xsl:element name="xsl:when">
                <xsl:attribute name="test">following-sibling::quantityGroup</xsl:attribute>
                <xsl:value-of select="groupTypePrefixes/minimumRange"/>
              </xsl:element>
              <xsl:element name="xsl:otherwise">
                <xsl:value-of select="groupTypePrefixes/minimum"/>
              </xsl:element>
            </xsl:element>
          </xsl:element>
          <xsl:element name="xsl:when">
            <xsl:attribute name="test">@quantityGroupType = 'maximum'</xsl:attribute>
            <xsl:element name="xsl:choose">
              <xsl:element name="xsl:when">
                <xsl:attribute name="test">preceding-sibling::quantityGroup</xsl:attribute>
                <xsl:value-of select="groupTypePrefixes/maximumRange"/>
              </xsl:element>
              <xsl:element name="xsl:otherwise">
                <xsl:value-of select="groupTypePrefixes/maximum"/>
              </xsl:element>
            </xsl:element>
          </xsl:element>
          <xsl:element name="xsl:otherwise">
            <xsl:value-of select="groupTypePrefixes/nominal"/>
          </xsl:element>
        </xsl:element>
        <xsl:element name="xsl:for-each">
          <xsl:attribute name="select">quantityValue|quantityTolerance</xsl:attribute>
          <xsl:element name="xsl:if">
            <xsl:attribute name="test">position() != 1</xsl:attribute>
            <xsl:element name="xsl:text">
              <xsl:text> </xsl:text>
            </xsl:element>
          </xsl:element>
          <xsl:element name="xsl:apply-templates">
            <xsl:attribute name="select">.</xsl:attribute>
          </xsl:element>
        </xsl:element>
        <xsl:element name="xsl:apply-templates">
          <xsl:attribute name="select">@quantityUnitOfMeasure</xsl:attribute>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">quantityValue</xsl:attribute>
        <xsl:element name="xsl:call-template">
          <xsl:attribute name="name">format-quantity-value</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:apply-templates">
          <xsl:attribute name="select">@quantityUnitOfMeasure</xsl:attribute>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">quantityTolerance</xsl:attribute>
        <xsl:element name="xsl:call-template">
          <xsl:attribute name="name">tolerance-type</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:call-template">
          <xsl:attribute name="name">format-quantity-value</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:apply-templates">
          <xsl:attribute name="select">@quantityUnitOfMeasure</xsl:attribute>
        </xsl:element>
      </xsl:element>
      <xsl:element name="xsl:template">
        <xsl:attribute name="name">tolerance-type</xsl:attribute>
        <xsl:element name="xsl:param">
          <xsl:attribute name="name">type</xsl:attribute>
          <xsl:attribute name="select">@quantityToleranceType</xsl:attribute>
        </xsl:element>
        <xsl:element name="xsl:choose">
          <xsl:element name="xsl:when">
            <xsl:attribute name="test">$type = 'plus'</xsl:attribute>
            <xsl:text>+</xsl:text>
          </xsl:element>
          <xsl:element name="xsl:when">
            <xsl:attribute name="test">$type = 'minus'</xsl:attribute>
            <xsl:text>-</xsl:text>
          </xsl:element>
          <xsl:element name="xsl:otherwise">
            <xsl:text>± </xsl:text>
          </xsl:element>
        </xsl:element>
      </xsl:element>
      <xsl:choose>
        <xsl:when test="uoms">
          <xsl:apply-templates select="uoms"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="xsl:template">
            <xsl:attribute name="match">@quantityUnitOfMeasure</xsl:attribute>
            <xsl:element name="xsl:text">
              <xsl:text> </xsl:text>
            </xsl:element>
            <xsl:element name="xsl:value-of">
              <xsl:attribute name="select">.</xsl:attribute>
            </xsl:element>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:choose>
        <xsl:when test="currencies">
          <xsl:apply-templates select="currencies"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="xsl:template">
            <xsl:attribute name="match">@quantityTypeSpecifics</xsl:attribute>
            <xsl:attribute name="mode">prefix</xsl:attribute>
          </xsl:element>
          <xsl:element name="xsl:template">
            <xsl:attribute name="match">@quantityTypeSpecifics</xsl:attribute>
            <xsl:attribute name="mode">postfix</xsl:attribute>
            <xsl:element name="xsl:text">
              <xsl:text> </xsl:text>
            </xsl:element>
            <xsl:element name="xsl:value-of">
              <xsl:attribute name="select">.</xsl:attribute>
            </xsl:element>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:template>

  <xsl:template name="quantity">
    <xsl:element name="xsl:if">
      <xsl:attribute name="test">@quantityTypeSpecifics</xsl:attribute>
      <xsl:element name="xsl:apply-templates">
        <xsl:attribute name="select">@quantityTypeSpecifics</xsl:attribute>
        <xsl:attribute name="mode">prefix</xsl:attribute>
      </xsl:element>
    </xsl:element>
    <xsl:element name="xsl:apply-templates">
      <xsl:attribute name="select">*|text()[normalize-space(.)!='']</xsl:attribute>
    </xsl:element>
    <xsl:element name="xsl:if">
      <xsl:attribute name="test">@quantityTypeSpecifics</xsl:attribute>
      <xsl:element name="xsl:apply-templates">
        <xsl:attribute name="select">@quantityTypeSpecifics</xsl:attribute>
        <xsl:attribute name="mode">postfix</xsl:attribute>
      </xsl:element>
    </xsl:element>
  </xsl:template>

  <xsl:template match="wrapInto/*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:call-template name="quantity"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="uoms">
    <xsl:element name="xsl:template">
      <xsl:attribute name="match">@quantityUnitOfMeasure</xsl:attribute>
      <xsl:copy-of select="xsl:*"/>
      <xsl:choose>
        <xsl:when test="uom">
          <xsl:element name="xsl:choose">
            <xsl:apply-templates select="uom"/>
            <xsl:element name="xsl:otherwise">
              <xsl:element name="xsl:text">
                <xsl:text> </xsl:text>
              </xsl:element>
              <xsl:element name="xsl:value-of">
                <xsl:attribute name="select">.</xsl:attribute>
              </xsl:element>
            </xsl:element>
          </xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="xsl:text">
            <xsl:text> </xsl:text>
          </xsl:element>
          <xsl:element name="xsl:value-of">
            <xsl:attribute name="select">.</xsl:attribute>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:template>

  <xsl:template match="uom">
    <xsl:element name="xsl:when">
      <xsl:attribute name="test">
        <xsl:text>. = '</xsl:text>
        <xsl:value-of select="@name"/>
        <xsl:text>'</xsl:text>
      </xsl:attribute>
      <xsl:copy-of select="node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="currencies">
    <xsl:element name="xsl:template">
      <xsl:attribute name="match">@quantityTypeSpecifics</xsl:attribute>
      <xsl:attribute name="mode">prefix</xsl:attribute>
      <xsl:copy-of select="xsl:*"/>
      <xsl:choose>
        <xsl:when test="currency">
          <xsl:element name="xsl:choose">
            <xsl:apply-templates select="currency" mode="prefix"/>
          </xsl:element>
        </xsl:when>
      </xsl:choose>
    </xsl:element>
    <xsl:element name="xsl:template">
      <xsl:attribute name="match">@quantityTypeSpecifics</xsl:attribute>
      <xsl:attribute name="mode">postfix</xsl:attribute>
      <xsl:copy-of select="xsl:*"/>
      <xsl:choose>
        <xsl:when test="currency">
          <xsl:element name="xsl:choose">
            <xsl:apply-templates select="currency" mode="postfix"/>
            <xsl:element name="xsl:otherwise">
              <xsl:element name="xsl:text">
                <xsl:text> </xsl:text>
              </xsl:element>
              <xsl:element name="xsl:value-of">
                <xsl:attribute name="select">.</xsl:attribute>
              </xsl:element>
            </xsl:element>
          </xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="xsl:text">
            <xsl:text> </xsl:text>
          </xsl:element>
          <xsl:element name="xsl:value-of">
            <xsl:attribute name="select">.</xsl:attribute>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:template>

  <xsl:template match="currency" mode="prefix">
    <xsl:element name="xsl:when">
      <xsl:attribute name="test">
        <xsl:text>. = '</xsl:text>
        <xsl:value-of select="@name"/>
        <xsl:text>'</xsl:text>
      </xsl:attribute>
      <xsl:copy-of select="prefix/node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="currency" mode="postfix">
    <xsl:element name="xsl:when">
      <xsl:attribute name="test">
        <xsl:text>. = '</xsl:text>
        <xsl:value-of select="@name"/>
        <xsl:text>'</xsl:text>
      </xsl:attribute>
      <xsl:copy-of select="postfix/node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>


/ gopher://khzae.net/0/s1000d/s1kd-tools/src/tools/s1kd-uom/uomdisplay.xsl
Styles: Light Dark Classic