XSLT: мы можем использовать значение абс? - PullRequest
4 голосов
/ 03 февраля 2010

Я хотел бы знать, можем ли мы использовать в XLST математику: abs (...)?Я видел это где-то, но это не работает.У меня есть что-то вроде:

<tag>
  <xsl:value-of select="./product/blablaPath"/>
</tag>

Я пытался сделать что-то вроде:

<tag>
  <xsl:value-of select="math:abs(./product/blablaPath)"/>
</tag>

, но не работает.Я использую язык Java 1.6.

Ответы [ 5 ]

7 голосов
/ 15 февраля 2010

Вот одно выражение XPath , реализующее функцию abs():

($x >= 0)*$x - not($x >= 0)*$x

Это оценивается как abs($x).

Вот краткая демонстрация этого в действии :

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:param name="x" select="."/>
  <xsl:value-of select=
  "($x >= 0)*$x - not($x >= 0)*$x"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML:

<t>
  <num>-3</num>
  <num>0</num>
  <num>5</num>
</t>

требуемый, правильный результат (abs () на каждое число) получается :

<t>
  <num>3</num>
  <num>0</num>
  <num>5</num>
</t>
3 голосов
/ 03 февраля 2010

abs() достаточно тривиально.Реализованный в чистом XSLT, он будет выглядеть так:

<xsl:template name="abs">
  <xsl:param name="number">

  <xsl:choose>
    <xsl:when test="$number &gt;= 0">
      <xsl:value-of select="$number" />
    <xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$number * -1" />
    </xsl:otherwise>
  </xsl:if>
</xsl:template>

, в вашем контексте вы будете вызывать его так:

<tag>
  <xsl:call-template name="abs">
    <xsl:with-param name="number" select="number(product/blablaPath)" />
  </xsl:call-template>
</tag>
1 голос
/ 22 августа 2013

Очень простое решение - использовать функцию перевода XSL 1.0.Т.е.

<xsl:value-of select="translate($x, '-', '')/>
1 голос
/ 02 мая 2013

Anotherway:

(2*($x >= 0) - 1)*$x

Когда $ x положительно, тест возвращает «true», поэтому 2 * true-1 возвращает 1, поэтому окончательный результат равен $ x. Когда $ x отрицательно, тест возвращает «false», поэтому 2 * false-1 возвращает -1, поэтому окончательный результат - $ x.

Использование

2*(any-test-here)-1
- хороший способ получить + 1 , когда тест равен true , и -1 , когда false .
0 голосов
/ 03 февраля 2010

math:abs не встроено в XSLT или XPATH. Это расширение XSLT, предоставляемое средой выполнения, с которой вы выполняете преобразование.

Вот статья о .NET xslt extensions .

Вот один для Java (Xalan).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...