-1

XML データを使用する XSLT シートを処理するために C# を使用しています。

私の XSLT シートでは、XML データを通過し、渡されたパラメーターに基づいて数値を表示するテンプレートを適用しています。

XSLT シートを実行してパラメーターを渡すと、何も出力されません。XSLT の html 側は問題なく動作するようです。

これが私のXSLTコードです:

http://pastebin.com/eL9wnRgK

ここに私のXMLファイルがあります:

http://pastebin.com/B3eqbd6K

上記を処理するために Visual Studio 2012 を使用しています。xslt の処理に使用する C# クラスを除外すると、VS の組み込み XSLT デバッガーでも何もしないようです (データは出力されません)。

何時間も費やしましたが、どこが間違っているのかを実際に見つけることができず、赤くハイライトされている構文やエラーが表示されていません。この言語は C# よりもはるかに難しい...

4

1 に答える 1

1

XSLT には深刻なクリーンアップが必要でした。DRY の原則を忘れないでください。繰り返し部分の使用を避けることで、XSLT の長さを 100 行以上削減することができました。パラメータ値を正しく渡す方法がわかれば、これでうまくいくはずです。

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

  <!--Search parameter to store the search string entered-->
  <xsl:param name="SearchRecipe" />
  <!--Search type parameter to store the type of search selected-->
  <xsl:param name="SearchType" select="'Start'" />
  <xsl:param name ="IsVegetarian" />

  <!--First part of code to capture values from user and then store them 
        in the variables above-->
  <xsl:template match="/">
    <html>

      <head>
        <!--Sets Title of Page (within our Master template)-->
        <a>
          <title>Recipe Headquarters</title>
        </a>
        <!--Reference to the stylesheet we are using-->
        <link href="Cafesheet.css" rel="stylesheet" type="text/css" />
      </head>

      <body>
        <form  id="banner" name="content" method="get" action="Commercial.aspx">
          <h1 >Recipe Book</h1>
          <div id="content">
            <p>
              <label id="h2" for="txtFilter">Search Recipe Book </label>

              <input type="text" name="txtFilter" 
                     id="txtFilter" value="{$SearchRecipe}"/>

              <!--Creates a simple submit button-->
              <input type="submit" name="btnSearch" 
                     id="btnSearch" value="Submit" />
              <br />
              <br />


              <!--Label of text for our set of radio buttons-->
              <label for="rdoSearchType">Select a Search Type  </label>

              <!--Behold, the radio buttons themselves-->
              <xsl:call-template name="SearchTypeRadio">
                <xsl:with-param name="value" select="'Start'" />
                <xsl:with-param name="text" select="'Starts with'" />
              </xsl:call-template>
              <xsl:call-template name="SearchTypeRadio">
                <xsl:with-param name="value" select="'Contains'" />
                <xsl:with-param name="text" select="'Contains'" />
              </xsl:call-template>
              <xsl:call-template name="SearchTypeRadio">
                <xsl:with-param name="value" select="'RecipeType'" />
                <xsl:with-param name="text" select="'Recipe Type'" />
              </xsl:call-template>
              <br />
              <br />
              <br />

              <!--Applys the template from the second part-->
              <xsl:apply-templates 
                select="CafeRecipes[$SearchType = 'Start' or 
                                    $SearchType = 'Contains' or
                                    $SearchType = 'RecipeType']" />

            </p>
            <!--End our of Search input text box and the Type of search 
                   we want to do Div-->
          </div>

          <!--Our self closing footer div, yayyyy. Single line madness-->
          <h1>Made by Jagga ^_^</h1>
        </form>
      </body>
    </html>
  </xsl:template>

  <xsl:template name="SearchTypeRadio">
    <xsl:param name="value" />
    <xsl:param name="text" />
    <input type="radio" name="rdoSearchType" value="{$value}">
      <xsl:if test="$SearchType = $value">
        <xsl:attribute name="checked">checked</xsl:attribute>
      </xsl:if>
      <xsl:value-of select="$text"/>
    </input>
  </xsl:template>

  <!--This will be the second part of the xsl code to manipulate the data 
          based on our chosen values from above-->
  <!--Declares new xsl template-->
  <xsl:template match="CafeRecipes">
    <!--Creates a small table to display the data output produced-->
    <table id="content" border="5">
      <tr>
        <th>Recipe #</th>
        <th>Recipe Name</th>
        <th>Ingredients Required</th>
        <th>Instructions</th>
        <th>Recipe Type</th>
        <th>Vegetarian?</th>
      </tr>

      <xsl:variable name="matchedRecipes"
         select="ARecipe[
               ($SearchType = 'Start' and starts-with(ItemName, $SearchRecipe)) or
               ($SearchType = 'Contains' and contains(ItemName, $SearchRecipe)) or
               ($SearchType = 'RecipeType' and 
                            contains(RecipeInfo/RecipeType, $SearchRecipe))
                          ]" />

      <xsl:if test="$SearchType = 'Start' or $SearchType = 'Contains'">
        <xsl:apply-templates select="$matchedRecipes">
          <xsl:sort select="RecipeInfo/RecipeType" order="ascending" />
        </xsl:apply-templates>
      </xsl:if>
      <xsl:if test="$SearchType = 'RecipeType'">
        <xsl:apply-templates select="$matchedRecipes">
          <xsl:sort select="ItemName" order="ascending" />
        </xsl:apply-templates>
      </xsl:if>
    </table>
  </xsl:template>

  <xsl:template match="ARecipe">
    <tr>
      <xsl:apply-templates select="*[not(*)] | RecipeInfo/*" />
    </tr>
  </xsl:template>

  <xsl:template match="ARecipe/* | ARecipe/*/*">
    <td width="300">
      <xsl:apply-templates select="." mode="content" />
    </td>
  </xsl:template>

  <xsl:template match="Vegetarian[. = 'Yes']" mode="content">
        YesThisWorks and it's vegetarian
  </xsl:template>

  <xsl:template match="Vegetarian[. = 'No']" mode="content">
    YesThisWorks and it's NOT vegetarian
  </xsl:template>
</xsl:stylesheet>

AddParameter()ASPX コードで I seeへの唯一の呼び出しはMyXMLConduit.AddParameter("TheFilter", AFilter);. XSLT のパラメーターの名前は「SearchRecipe」であるため、「TheFilter」ではなく、それをパラメーター名として使用する必要があります。また、クエリ パラメータの値を取得し、rdoSearchTypeそれを XSLT のパラメータの 1 つとして追加する必要があります。

string searchType = Request["rdoSearchType"];
if(searchType != null)
{
    MyXMLConduit.AddParameter("SearchType", searchType);
}
于 2013-02-03T04:02:23.603 に答える