Xslt 按位逻辑

Xslt 按位逻辑,xslt,logic,bit-manipulation,Xslt,Logic,Bit Manipulation,我有一个使用整数存储多个值的现有数据集;传统前端执行简单的逐位检查(例如,在C#:iValues&16==16中),以查看是否设置了特定值。是否可以在XSL中执行逐位操作,或者更明确地说,通过掩蔽进行位级比较?内置的“and”将始终导致“true”或“false”,但可能通过可用的数学运算符实现吗 我目前正在使用.NET 2.0,它使用XSLT 1.0。XSLT是,例如,请参见或,因此可以这样做。但我只使用过一两次XSLT,无法给出任何解决方案 更新 我只是再次阅读了一篇教程,并使用以下事实找到

我有一个使用整数存储多个值的现有数据集;传统前端执行简单的逐位检查(例如,在C#:iValues&16==16中),以查看是否设置了特定值。是否可以在XSL中执行逐位操作,或者更明确地说,通过掩蔽进行位级比较?内置的“and”将始终导致“true”或“false”,但可能通过可用的数学运算符实现吗

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

XSLT是,例如,请参见或,因此可以这样做。但我只使用过一两次XSLT,无法给出任何解决方案

更新

我只是再次阅读了一篇教程,并使用以下事实找到了一个解决方案<代码>位集(x,n)如果设置了
x
n
第位,则返回true,否则返回false

bitset(x, n) := floor(x / 2^n) mod 2 == 1
下面是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>

这既不优雅也不友好,可能有更简单的解决方案,但它是有效的。考虑到这是我第一次接触XSLT,我非常满意。

我在XSLT/XPath中没有看到类似的情况。但我发现了。如果确实需要的话,也许可以使用相同的方法。

XSLT不定义按位操作。如果你想要它们,你必须自己滚

如果您专门在.NET 2.0上下文中使用XSLT,也就是说,
xslcomiledtransform
class,那么最简单的解决方案是使用脚本块引入执行此操作的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>

这将返回变量的二进制数组(存储在$var中)


顺便说一句,我使用XPath 2.0来实现这一点

图灵完成日期如何确定是否存在按位运算符?如果它是图灵完成的,它可以计算每个函数,因此可以对整数进行按位运算。嗯。。。我不明白。我熟悉图灵完备性的概念,但我仍然可以想象一种图灵完备性语言,它没有位运算符,也就是说,没有办法将数字分割成更小的块。不需要位运算——你可以模拟它们。取一些变量(可能是32个),用零初始化它们,并将它们看作一个数组。取另一个包含输入值的变量X。看看最右边的变量。是零吗?设置为1。是一个吗?从右到左遍历数组,并将所有1设置为零,直到找到第一个零。将此设置为1。现在从X中减去一,然后相互作用,直到X为零。当您达到零时,数组将包含X的二进制表示形式。所有这些都是通过将变量设置为两个二进制符号“零”和“一”、将变量与符号进行比较、从变量中减去1、一点分支和一种间接访问来完成的。这比要求的还要多——你可以用更少的钱来解决这个问题,比如说,你不需要减法。这就是图灵完全性的含义——你可以在每个图灵完全系统上做完全相同的事情;只需更改命名模板以接受数字作为参数,它就可以像champ一样处理任意值。谢谢,但不适用于.NET framework(根据最初的问题,遗憾的是.NET 4.0仍然是这样)。只有在使用支持XPath 2.0的第三方库时,您的解决方案才有效。
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 
<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>
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("foo.xsl",
  new XsltSettings { EnableScript = true },
  new XmlUrlResolver());
<xsl:value-of select="for $n in (128, 64, 32, 16, 8, 4, 2, 1) return if ((floor($var div $n) mod 2) = 1) then 1 else 0"/>