2013-03-06 2 views
1

У меня есть динамически сгенерированный XML, который ниже, который заполняет значения узлов во время выполнения.Как преобразовать XML в XSLT с помощью функции C#

<?xml version="1.0" encoding="utf-8" ?> 
<master> 
    <child> 
    <category1>Category1_A</category1> 
    <category2>Category2_B </category2> 
    </child> 
</master> 

У меня есть ключ конфигурации категории кода в моем web.config, как показано ниже

<add key="Code" value="A1|A2" /> 

Ниже мой XSLT & я знаю, что это не очень хорошо отформатирован.

И я следующие вопросы в этой XSLT

  1. Как я могу передать ключ конфигурации в ниже функции, так как это не в XML.
  2. Если этот метод возвращает ложь, то я хочу вернуть строковое сообщение от атрибута XSLT, как «К сожалению, комбинация не соответствует.»
  3. Я знаю, что это довольно немного запутанным, но я знаю, что это очень интересно.

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
        xmlns:user="urn:my-scripts"> 
    
        <msxsl:script language="C#" implements-prefix="user"> 
        <![CDATA[ 
        public string checkCategory (string category1,string category2) 
        { 
        if((category1=="Category1_A" && category1==" Category2_B") && ConfigurationManager.AppSetting["Code"].contains("A1")) 
         return true; 
         else 
         return false; 
        } 
         ]]> 
        </msxsl:script> 
        <xsl:template match="master"> 
        <child> 
         <circumference> 
         <xsl:value-of select="user: checkCategory (category1,category2)"/> 
         <!--if method return false then : return Sorry, Combination doesn’t match.”--> 
         </circumference> 
        </child> 
        </xsl:template> 
    </xsl:stylesheet> 
    
+0

Из того, что вы опубликовали, похоже, что вы хотите сравнить содержимое XML с конфигурационной строкой и ничего больше. Почему вы делаете это с XSLT, а не с любой другой технологией обработки XML? –

+0

@AnnL: это предыдущая реализованная логика в проекте, и я делаю некоторые изменения на этом. – intelliWork

ответ

1

Если функция возвращает true и false, то вы должны изменить тип возвращаемого значения bool:

<msxsl:script language="C#" implements-prefix="user"> 
    <![CDATA[ 
    public bool checkCategory (string category1,string category2) 
    { 
     if((category1=="Category1_A" && category2==" Category2_B") && ConfigurationManager.AppSetting["Code"].contains("A1")) 
     return true; 
     else 
     return false; 
    } 
    ]]> 
</msxsl:script> 

и вы можете упростить код немного:

<msxsl:script language="C#" implements-prefix="user"> 
    <![CDATA[ 
    public bool checkCategory (string category1,string category2) 
    { 
     return (category1 == "Category1_A" && category2 == "Category2_B") && 
       ConfigurationManager.AppSetting["Code"].contains("A1"); 
    } 
    ]]> 
</msxsl:script> 

Тогда вы могли бы просто использовать xsl:if:

<xsl:template match="master"> 
    <child> 
     <circumference> 
     <xsl:if select="user:checkCategory(category1,category2)"> 
      <xsl:text>Sorry, Combination doesn’t match.</xsl:text> 
     </xsl:if> 
     </circumference> 
    </child> 
    </xsl:template> 
+0

Вы разместили этот комментарий в своем ответе, когда вы попытались отредактировать мой ответ: «Я изменил: второй, чтобы быть category2 .. но все же, как мы можем использовать ConfigurationManager.AppSetting [« Code »]. Содержит (« A1 »)) в xslt, потому что его нет в XML ?? " Пробовали ли вы использовать полное пространство имен в классе диспетчера конфигурации? В противном случае вы можете попробовать передать значение в качестве параметра XSLT для XSLT. – JLRishe

+0

Можете ли вы сделать это более ясным в ConfigurationManager.AppSetting ["Code"]. Содержит ("A1")) – intelliWork

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