2013-04-03 1 views
1

Как включить элементы, которые указывают флаг в битовой маске на битовую маску? У меня есть следующий XML-схемы:Как объединить XML-элементы, содержащие битовые флаги, с одним значением

enter image description here

Как можно, например, превратить этот XML

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

В этот выходной XML с помощью XSLT?

<Bitmask>10</Bitmask> 

(10 = 1010 бинарное - бит 1 и 3 установлены)

В Procedual языке программирования я бы просто сделать что-то вроде этого:

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

Но это не представляется возможным в xslt, потому что переменная xsl: static. Есть ли другой подход или как это можно сделать?

+0

XSLT 1.0 или 2.0, а если бывший процессор XSLT? –

+0

XSLT 2.0 Я использую .NET XslCompiledTransform как процессор: http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx – Jeldrik

+0

Если вы используете XslCompiledTransform, то это 1,0, а не 2,0. –

ответ

0

Это sytlesheet fragement решает эту проблему для класса .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.

Смежные вопросы