5

XslTransformException をスローしているコードがいくつかあります。これは望ましい動作です (XSL には、@terminate が yes に設定された xsl:message 要素が含まれています)。

コードでこの例外をキャッチしようとしていますが、この例外のクラスを含むアセンブリが見つからず、MSDN でこの例外に関するドキュメントを見つけて、適切な継承クラスのアイデアを得ることができません (つまり、使用を避けるため)私のキャッチブロックのクラス例外)。

System.Xml および Sytem.Xml.Linq アセンブリが参照されており、次の using ステートメントがあります。

using System.Xml;
using System.Xml.Xsl;

例外は System.Xml.Xsl 名前空間にあります。すなわち:

System.Xml.Xsl.XslTransformException

どのアセンブリを参照する必要があるか考えていますか?

編集: 要求に応じて、この例外を再現するサンプル コードを以下に示します。

using System;
using System.Xml;
using System.Xml.Xsl;
using System.Text;

namespace StackOverflowDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            XmlDocument xmsl = new XmlDocument();
            xmsl.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\" exclude-result-prefixes=\"msxsl\"><xsl:output method=\"xml\" indent=\"yes\"/><xsl:template match=\"@* | node()\"><xsl:message terminate=\"yes\">this should throw an exception</xsl:message><xsl:copy><xsl:apply-templates select=\"@* | node()\"/></xsl:copy></xsl:template></xsl:stylesheet>");

            XslCompiledTransform xsl = new XslCompiledTransform();
            xsl.Load(xmsl.CreateNavigator());

            XmlDocument xml = new XmlDocument();
            xml.LoadXml("<root />");

            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb);
            /*
            try
            {
            */
                xsl.Transform(xml.CreateNavigator(), writer);
            /*
            }
            catch(XslTransformException e) //<-- this class does not exist
            {
                Console.WriteLine(e.ToString());
            }            
            */
        }
    }
}
4

3 に答える 3

5

次のブロックを追加すると、catchすべてが明らかになります。

catch (Exception e)
{
    var t = e.GetType();
    while (t != null)
    {
        Console.WriteLine(t.AssemblyQualifiedName);
        t = t.BaseType;
    }
}

出力:

System.Xml.Xsl.XslTransformException, System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml.Xsl.XsltException, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.SystemException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

私は無視しますが、代わりにXslTransformExceptionキャッチする必要があります。XsltException結局のところ、それXslCompiledTransform.Transformはスローするように文書化されているものです。

于 2012-11-06T17:55:23.237 に答える
3

入ったSystem.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

ただし、例外がinternalあるため、直接キャッチすることはできません。それは拡張XsltExceptionするので、Jon Skeet が述べたように、ちょうど catchXsltExceptionです。

于 2012-11-06T17:34:35.630 に答える
0

名前空間には参照がありませんXslTransformExceptionが、System.Xsl の残りの部分は System.Xml.dll に存在します。これは、MSDN で確認できます(例として名前空間の最初の型を選択しました) 。Assembly:行のすぐ上にあります。構文ブロック。

于 2012-11-06T17:32:28.640 に答える