C# XslCompiledTransform转换调用导致DTD崩溃

C# XslCompiledTransform转换调用导致DTD崩溃,c#,xml,xslt,C#,Xml,Xslt,在转换xml数据时,我遇到了一些问题。我在.Net framework 4.0上使用XslCompiledTransform对象 XDocument v_xdoc = XDocument.Load("XLMData.xml"); XslCompiledTransform myXslTrans = new XslCompiledTransform(); myXslTrans.Load("XSLTFile1.xslt", new XsltSettings(true, false), null); X

在转换xml数据时,我遇到了一些问题。我在.Net framework 4.0上使用XslCompiledTransform对象

XDocument v_xdoc = XDocument.Load("XLMData.xml");
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load("XSLTFile1.xslt", new XsltSettings(true, false), null);
XPathNavigator nav = v_xdoc.CreateNavigator();

using (TextWriter myWriter = File.CreateText("result.scpt"))
{
    myXslTrans.Transform(nav, null, myWriter);
}
我有一次车祸:

出于安全原因,在本文档中禁止使用DTD XML。要在上启用DTD处理集,请解析XmlReaderSettings DtdProcessing上的属性,并将参数传递给方法XmlReader.Create

使用XmlReaderSettings更改代码时:

XDocument v_xdoc = XDocument.Load("XLMData.xml");

XslCompiledTransform myXslTrans = new XslCompiledTransform(true);
myXslTrans.Load(
    XmlReader.Create("XSLTFile1.xslt", 
    new XmlReaderSettings()
    {
        DtdProcessing = DtdProcessing.Parse
    }),
    new XsltSettings(true, false),
    null
);

XPathNavigator nav = v_xdoc.CreateNavigator();
using (TextWriter myWriter = File.CreateText("result.scpt"))
{
    myXslTrans.Transform(nav, null, myWriter);
}
我也有同样的崩溃

这是我的XSLT文件

<?xml version="1.0"?>

<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp "&#x00A0;">
  <!ENTITY euro "&#8364;" >
]>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:csv="csv:csv"
                xmlns:n="http://novamap.fr/xml/data/v1"
                version="1.0">

  <xsl:output method="text" encoding="utf-8"/>

  <xsl:variable name="delimiter" select="';'"/>

  <csv:columns>
    <column>BDC_ID_BON_DE_COMMANDE</column>
    <column>BDC_LI_BON_DE_COMMANDE</column>
    <column>BDC_REF_BON_DE_COMMANDE</column>
    <column>BDC_DT_EMISSION_STR</column>
  </csv:columns>

  <xsl:template match="/n:XmlModelBonDeCommande">

    <xsl:for-each select="document('')/*/csv:columns/*">
      <xsl:value-of select="."/>
      <xsl:if test="position() != last()">
        <xsl:value-of select="$delimiter"/>
      </xsl:if>
    </xsl:for-each>

    <xsl:text>
</xsl:text>
    <!-- Output rows for each matched property -->
    <xsl:apply-templates select="n:GMP_BON_DE_COMMANDE"/>
  </xsl:template>

</xsl:stylesheet>
和消息异常:

Pour des raisons de sécurité, DTD interdite dans ce document XML. Pour activer le traitement DTD, définissez sur Parse la propriété DtdProcessing sur XmlReaderSettings et transmettez les paramètres à la méthode XmlReader.Create.
当我删除DOCTYPE时,它可以正常工作,但我需要它。我没有找到加载xslt文件的好参数。有人有主意了吗?

在XSLT中使用文档似乎是导致异常的原因

你可以通过这样的改变来避免这种使用

<?xml version="1.0"?>

<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp "&#x00A0;">
  <!ENTITY euro "&#8364;" >
]>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:csv="csv:csv"
                xmlns:n="http://novamap.fr/xml/data/v1"
                version="1.0">

  <xsl:output method="text" encoding="utf-8"/>

  <xsl:variable name="delimiter" select="';'"/>

  <xsl:variable name="columns">
  <csv:columns>
    <column>BDC_ID_BON_DE_COMMANDE</column>
    <column>BDC_LI_BON_DE_COMMANDE</column>
    <column>BDC_REF_BON_DE_COMMANDE</column>
    <column>BDC_DT_EMISSION_STR</column>
  </csv:columns>
  </xsl:variable>

  <xsl:template match="/n:XmlModelBonDeCommande">

    <xsl:for-each select="exsl:node-set($columns)/csv:columns/*">
      <xsl:value-of select="."/>
      <xsl:if test="position() != last()">
        <xsl:value-of select="$delimiter"/>
      </xsl:if>
    </xsl:for-each>

    <xsl:text>
</xsl:text>
    <!-- Output rows for each matched property -->
    <xsl:apply-templates select="n:GMP_BON_DE_COMMANDE"/>
  </xsl:template>

</xsl:stylesheet>

异常文本似乎已关闭。这不是最初的英语例外,是吗?当你使用DtdProcessing时,你真的得到了完全相同的异常吗?当你有DtdProcessing的默认值时进行解析。禁止你发布的异常文本似乎与此一致?@PeterDuniho该文本是来自法语的传统。但是对于DtdProcessing.banford也有同样的崩溃。好吧,现在我们知道您的XSLT样式表使用文档来读取XSLT本身,这似乎是导致错误的原因。看起来VisualStudio可以运行和调试XML和样式表,而不会导致异常,但我目前不确定如何更改C代码以避免异常。但是,有一些方法可以更改XSLT,以避免使用DOCTYPE简单地创建一些实体,这些实体也可以直接以XML和Unicode字符表示。我还可以建议重写XSLT以避免使用文档。我重写我的答案是为了说明如何避免使用文档。也许这是你的一个选择。你发现马丁的答案有助于解决你的问题,这很好。供将来参考:您发布的文本不是堆栈跟踪。它只是程序的运行时输出;它只告诉我们加载了一堆dll,然后System.Data.SqlXml.dll抛出了XslTransformException。最关键的是,它没有告诉我们您的代码中哪一行被称为SqlXml.dll,也没有告诉我们该dll中调用了什么方法。如果Martin没有猜到实际的问题,那么真正的堆栈跟踪将非常有用。感谢您重新编写示例。Load方法在导致崩溃的调用转换中正常工作。请发布允许任何人重现问题的内容。然后请发布异常的堆栈跟踪,在您的第一篇文章中,您说Load正在引发异常。
Pour des raisons de sécurité, DTD interdite dans ce document XML. Pour activer le traitement DTD, définissez sur Parse la propriété DtdProcessing sur XmlReaderSettings et transmettez les paramètres à la méthode XmlReader.Create.
<?xml version="1.0"?>

<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp "&#x00A0;">
  <!ENTITY euro "&#8364;" >
]>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:csv="csv:csv"
                xmlns:n="http://novamap.fr/xml/data/v1"
                version="1.0">

  <xsl:output method="text" encoding="utf-8"/>

  <xsl:variable name="delimiter" select="';'"/>

  <xsl:variable name="columns">
  <csv:columns>
    <column>BDC_ID_BON_DE_COMMANDE</column>
    <column>BDC_LI_BON_DE_COMMANDE</column>
    <column>BDC_REF_BON_DE_COMMANDE</column>
    <column>BDC_DT_EMISSION_STR</column>
  </csv:columns>
  </xsl:variable>

  <xsl:template match="/n:XmlModelBonDeCommande">

    <xsl:for-each select="exsl:node-set($columns)/csv:columns/*">
      <xsl:value-of select="."/>
      <xsl:if test="position() != last()">
        <xsl:value-of select="$delimiter"/>
      </xsl:if>
    </xsl:for-each>

    <xsl:text>
</xsl:text>
    <!-- Output rows for each matched property -->
    <xsl:apply-templates select="n:GMP_BON_DE_COMMANDE"/>
  </xsl:template>

</xsl:stylesheet>