【问题标题】:how to combine XML elements containing bit flags to a single value如何将包含位标志的 XML 元素组合为单个值
【发布时间】:2013-04-03 09:16:56
【问题描述】:

如何将在位掩码中指定标志的元素转换为位掩码?我有以下 XML 架构:

我怎样才能转换这个 XML

<Flags>
  <Flag>1</Flag>
  <Flag>3</Flag>
</Flags>

使用 XSLT 到这个输出 XML 中?

<Bitmask>10</Bitmask>

(10 = 1010 二进制 - 位 1 和 3 已设置)

在程序化编程语言中,我会简单地做这样的事情:

var bitmask = 0;
foreach(var falg in flags) {
  bitmask = bitmask + pow(2,flag);
}

但这在 xslt 中是不可能的,因为 xsl:variable 是静态的。是否有其他方法,或者如何做到这一点?

【问题讨论】:

  • XSLT 1.0 还是 2.0,如果前者是哪个 XSLT 处理器?
  • XSLT 2.0 我使用 .NET XslCompiledTransform 作为处理器:msdn.microsoft.com/en-us/library/…
  • 如果您使用的是 XslCompiledTransform,那么它是 1.0,而不是 2.0。
  • hmm,对 - 我的样式表中有一个
  • 可能有一种方法可以在纯 XSLT 1.0 中将其编写为一组递归模板,但它不会很漂亮,而且正如你所说你正在使用 .NET XslCompiledTransform 它会更简单并且使用&lt;msxsl:script&gt; 编写扩展函数并在 JavaScript/C#/VB 中进行计算可能更有效

标签: xslt


【解决方案1】:

这个 sytlesheet 片段解决了 .NET XslCompiledTransform 类的问题:

<msxsl:script implements-prefix="script" language="C#">
    <![CDATA[
        public int ToBitmask(XPathNodeIterator node)
        {
            int bitmask = 0;
            while (node.MoveNext())
            {
                bitmask += Convert.ToInt32(Math.Pow(2, int.Parse(node.Current.Value)));
            }
            return bitmask;
        }
    ]]>
 </msxsl:script>
 <xsl:template match="Flags">
     <Btimask><xsl:value-of select="script:ToBitmask(Flag)"/></Btimask>
 </xsl:template>

但是,我更喜欢纯 XSLT 解决方案,这样我就可以在 XmlSpy 中调试样式表。

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多