XSLT Bitwise Logic

pdw*_*etz 7 xslt logic bit-manipulation

我有一个现有的数据集,利用一个整数来存储多个值; 传统前端做了一个简单的按位检查(例如在C#:iValues&16 == 16)以查看是否设置了特定值.是否可以在XSL中进行按位运算,更明确地说,是否可以通过屏蔽进行位级比较?内置的"和"将始终导致"真"或"假",但也许可以通过数学运算符获得?

我目前正在使用.NET 2.0,它使用XSLT 1.0.

Dan*_*ner 14

XSLT是Turing-complete,例如可以在这里这里看到,因此可以完成.但我只使用了一到两次XSLT并且无法解决问题.

UPDATE

我刚刚再次阅读了一个教程,并使用以下事实找到了解决方案.bitset(x, n)如果设置了n-th位,x则返回true,否则返回false.

bitset(x, n) := floor(x / 2^n) mod 2 == 1
Run Code Online (Sandbox Code Playgroud)

以下是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>
Run Code Online (Sandbox Code Playgroud)

将改变这个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>
Run Code Online (Sandbox Code Playgroud)

到一个HTML文档,其中的表格显示了数字的位数.

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 
Run Code Online (Sandbox Code Playgroud)

这既不优雅也不好,并且可能有更简单的解决方案,但它有效.鉴于这是我第一次接触XSLT,我非常满意.

  • 如果存在按位运算符,Turing-complete datermine如何得到答案? (2认同)
  • 如果它是Turing-complete,它可以计算每个函数,因此对整数进行逐位运算. (2认同)
  • 不需要按位运算 - 您可以模拟它们。取多个变量(可能是 32 个),用零初始化它们,并将它们视为一个数组。取另一个包含您的输入值的变量 X。查看最右边的变量。是零吗?将其设置为一。是一个吗?从右向左遍历数组并将所有 1 设置为零,直到找到第一个零。将其设置为一。现在从 X 中减一并对所有内容进行迭代,直到 X 为零。当达到零时,数组将包含 X 的二进制表示形式。 (2认同)
  • 所有这些都是通过将变量设置为两个任意符号“零”和“一”、将变量与符号进行比较、从变量中减去 1、一点分支以及一种间接访问来完成的。这仍然比需要的要多得多 - 你可以用更少的东西来解决这个问题,例如,你不需要减法。这就是图灵完备性的含义——你可以在每个图灵完备系统上做完全相同的事情。 (2认同)

Grz*_*zki 3

我在 XSLT/XPath 中还没有看到类似的东西。但我发现有人手动实现这种操作。如果您确实需要,也许您可​​以使用相同的方法。