Разбор строки в int, C# внутри таблицы стилей XSL

Я новичок в таблицах стилей XSL, так что потерпите меня здесь.

У меня есть встроенный блок С# в моем .xsl. Это потому, что мне нужно что-то, что будет принимать строку чисел (например: "1,3,5"). Я хочу, чтобы это были цифры на ','. Блок кода является частью цикла XSL, поэтому он передает, на какой итерации он находится, и сравнивает это число со списком, полученным через строку. Если счетчик итераций есть в списке, верните true. Если это не так, верните False. Строка также может быть указана как «все», и в этом случае просто верните true.

Вот что я придумал:

<msxsl:script language="c#" implements-prefix="user">
    <![CDATA[

        public bool showStoryImg(string desiredImgs, int currentNum){
            bool rtnVal = false;
            try
            {
                if (desiredImgs == "all")
                {
                    rtnVal = true;
                }
                else
                {
                    string[] numStrArr = desiredImgs.Split(',');
                    int[] values = new int[numStrArr.Length];
                    for(int x = 0; x < numStrArr.Length; x++)
                    {
                       values[x] = Convert.ToInt32(numStrArr[x].ToString());
                    }

                    foreach(int y in values)
                    {
                        if(currentNum == y){
                            return true;
                        }
                        else
                        {
                            rtnVal = false;
                        }
                    }
                }
            }
            catch(Exception e)
            {
                rtnVal = false;
            }
            return rtnVal;
        }
    ]]>
</msxsl:script>

Однако я боюсь, что моя проблема в том, что XSL не может использовать библиотеки .NET, поэтому этот код не работает. Есть ли какие-либо предложения относительно того, как я должен это сделать?


person Drew Edgar    schedule 17.08.2012    source источник
comment
msdn.microsoft.com/en-us/library /533texsx(v=vs.71).aspx   -  person Sam Axe    schedule 18.08.2012


Ответы (2)


Функция расширения не нужна вообще!

Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="pImages" select="'1,3,5'"/>

 <xsl:variable name="vImages" select="concat(',',$pImages, ',')"/>

 <xsl:template match="/*">
     <xsl:apply-templates select=
     "img[contains($vImages, concat(',',position(),','))]/@src"/>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему XML-документу (в вопросе ничего не указано!):

<images>
  <img src="Image1.jpg"/>
  <img src="Image2.jpg"/>
  <img src="Image3.jpg"/>
  <img src="Image4.jpg"/>
  <img src="Image5.jpg"/>
</images>

обрабатывает только элементы с позицией, указанной в параметре $pImages — в этом случае просто выводит их атрибуты src:

Image1.jpgImage3.jpgImage5.jpg
person Dimitre Novatchev    schedule 18.08.2012
comment
Ага! Большое спасибо, приятель! Это избавило меня от головной боли или трех: P - person Drew Edgar; 20.08.2012

string в int без библиотек не ужасно сложно (при условии, что String.Split работает):

// untested, off-the-cuff
for(int x = 0; x < numStrArr.Length; x++)
{
   int temp = 0;

   for(int y= 0; y < numStrArr[x].Length; y++)
   {
       temp *= 10;
       temp += (numStrArr[x][y] - 48);
   }

   values[x] = temp;
}
person Austin Salonen    schedule 17.08.2012