2013-03-06 151 views
1

我有如下動態生成的XML,它在運行時填充節點值。如何使用C#函數將XML轉換爲XSLT轉換

<?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. 如果此方法返回false,那麼我想從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處理技術? – 2013-03-06 21:17:35

+0

@安妮:它是以前在項目中實現的邏輯,我正在對此進行一些更改。 – intelliWork 2013-03-07 05:24:29

回答

1

如果你的函數返回truefalse,那麼你應該返回類型更改爲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「]。contains(」A1「))在xslt中,因爲它不存在於XML中?「你有沒有嘗試使用完整的命名空間到配置管理器類?否則,您可以嘗試將該值作爲XSLT參數傳遞給XSLT。 – JLRishe 2013-03-07 05:38:47

+0

你可以在ConfigurationManager.AppSetting [「Code」]。contains(「A1」)。 – intelliWork 2013-03-07 17:46:05