XslCompiledTransform转换调用导致DTD崩溃

本文关键字:DTD 崩溃 转换 调用 XslCompiledTransform | 更新日期: 2023-09-27 18:28:14

当我想要转换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。要在分析XmlReaderSettings-DtdProcessing上的属性时启用DTD处理集,并将参数传递给方法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);
}

我也有同样的崩溃。

这是我的XsltFile

<?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>

这是我的XmlFile

<XmlModelBonDeCommande xmlns="http://novamap.fr/xml/data/v1">
  <GMP_BON_DE_COMMANDE>
    <BDC_ID_BON_DE_COMMANDE>154</BDC_ID_BON_DE_COMMANDE>
    <BDC_LI_BON_DE_COMMANDE>BON DE COMMANDE</BDC_LI_BON_DE_COMMANDE>
    <BDC_REF_BON_DE_COMMANDE>20140624-08</BDC_REF_BON_DE_COMMANDE>
    <BDC_DT_EMISSION>2014-06-24T02:00:00+02:00</BDC_DT_EMISSION>
    <BDC_DT_EMISSION_STR>24/06/2014</BDC_DT_EMISSION_STR>
    <BDC_MT_MONTANT_HT>132.38</BDC_MT_MONTANT_HT>
    <BDC_MT_MONTANT_HT_STR>132,38</BDC_MT_MONTANT_HT_STR>
    <BDC_MT_MONTANT_TVA>9.27</BDC_MT_MONTANT_TVA>
    <BDC_MT_MONTANT_TVA_STR>9,27</BDC_MT_MONTANT_TVA_STR>
    <BDC_MT_MONTANT_TTC>141.65</BDC_MT_MONTANT_TTC>
    <BDC_MT_MONTANT_TTC_STR>141,65</BDC_MT_MONTANT_TTC_STR>
  </GMP_BON_DE_COMMANDE>
</XmlModelBonDeCommande>

执行跟踪:

'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'c:'users'dell'documents'visual studio 2012'Projects'WindowsFormsApplication4'WindowsFormsApplication4'bin'Debug'WindowsFormsApplication4.exe' chargé, symboles chargés.
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Data.SqlXml'v4.0_4.0.0.0__b77a5c561934e089'System.Data.SqlXml.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Configuration'v4.0_4.0.0.0__b03f5f7f11d50a3a'System.Configuration.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'System.Xml.Xsl.CompiledQuery.1' chargé
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'System.Xml.Xsl.CompiledQuery.2' chargé
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:'Windows'Microsoft.Net'assembly'GAC_32'ISymWrapper'v4.0_4.0.0.0__b03f5f7f11d50a3a'ISymWrapper.dll' chargé
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Xml.resources'v4.0_4.0.0.0_fr_b77a5c561934e089'System.Xml.resources.dll' chargé
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Data.SqlXml.resources'v4.0_4.0.0.0_fr_b77a5c561934e089'System.Data.SqlXml.resources.dll' chargé
Une exception de première chance de type 'System.Xml.Xsl.XslTransformException' s'est produite dans System.Data.SqlXml.dll

和消息异常:

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文件的好参数。有人有主意吗?

XslCompiledTransform转换调用导致DTD崩溃

在XSLT中使用document('')似乎导致了异常。

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

<?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>