Также рассмотрите использование
Double.TryParse("1.234567E-06", System.Globalization.NumberStyles.Float, out MyFloat);
, Это гарантирует, что MyFloat
установлен оценить 0, если по любой причине преобразование не могло бы быть выполнено. Или Вы могли обернуть Double.Parse()
пример в Try..Catch
блок и установить MyFloat
на значение своего выбора, когда исключение обнаруживается.
Я не видел ничего подобного в XSLT / XPath. Но я нашел человека, выполняющего подобные операции вручную . Может быть, вы могли бы использовать тот же подход, если вам действительно нужно.
XSLT не определяет побитовые операции. Если они вам нужны, вы должны использовать свои собственные.
Если вы используете XSLT специально в контексте .NET 2.0, то есть класс XslCompiledTransform
, то самое простое решение - использовать блок сценариев чтобы ввести функцию C #, которая это делает, а затем просто вызвать ее:
<xsl:stylesheet xmlns:bitwise="urn:bitwise">
<msxsl:script language="CSharp" implements-prefix="bitwise">
<![CDATA[
public int and(int x, int y) { return x & y; }
public int or(int x, int y) { return x | y; }
...
]]>
</msxsl:script>
...
<xsl:value-of select="bitwise:and(@foo, @bar)" />
<xsl:value-of select="bitwise:or(@foo, @bar)" />
...
</xsl:stylesheet>
Или вы можете определить более высокоуровневые примитивы в блоке сценария, например HasFlag
, а затем используйте их.
При загрузке такой таблицы стилей вам необходимо явно включить в ней создание сценариев:
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("foo.xsl",
new XsltSettings { EnableScript = true },
new XmlUrlResolver());
XSLT is Turing-complete, see for example here or here, hence it can be done. But I have used XSLT only one or two times and can give no solution.
UPDATE
I just read a tutorial again and found a solution using the following fact. bitset(x, n)
returns true, if the n
-th bit of x
is set, false otherwise.
bitset(x, n) := floor(x / 2^n) mod 2 == 1
The following XSLT
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1" style="text-align:center;">
<tr bgcolor="#9acd32">
<th>Number</th>
<th>Bit 3</th>
<th>Bit 2</th>
<th>Bit 1</th>
<th>Bit 0</th>
</tr>
<xsl:for-each select="numbers/number">
<tr>
<td>
<xsl:value-of select="."/>
</td>
<td>
<xsl:choose>
<xsl:when test="floor(. div 8) mod 2 = 1">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:choose>
<xsl:when test="floor(. div 4) mod 2 = 1">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:choose>
<xsl:when test="floor(. div 2) mod 2 = 1">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:choose>
<xsl:when test="floor(. div 1) mod 2 = 1">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
will turn this XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<numbers>
<number>0</number>
<number>1</number>
<number>2</number>
<number>3</number>
<number>4</number>
<number>5</number>
<number>6</number>
<number>7</number>
<number>8</number>
<number>9</number>
<number>10</number>
<number>11</number>
<number>12</number>
<number>13</number>
<number>14</number>
<number>15</number>
</numbers>
into a HTML document with a table showing the bits of the numbers.
Number | Bit 3 | Bit 2 | Bit 1 | Bit 0
---------------------------------------
0 | 0 | 0 | 0 | 0
1 | 0 | 0 | 0 | 1
2 | 0 | 0 | 1 | 0
3 | 0 | 0 | 1 | 1
4 | 0 | 1 | 0 | 0
5 | 0 | 1 | 0 | 1
6 | 0 | 1 | 1 | 0
7 | 0 | 1 | 1 | 1
8 | 1 | 0 | 0 | 0
9 | 1 | 0 | 0 | 1
10 | 1 | 0 | 1 | 0
11 | 1 | 0 | 1 | 1
12 | 1 | 1 | 0 | 0
13 | 1 | 1 | 0 | 1
14 | 1 | 1 | 1 | 0
15 | 1 | 1 | 1 | 1
This is neither elegant nor nice in any way and there are probably much simpler solution, but it works. And given that it is my first contact with XSLT, I am quite satisfied.