platformnotsupportedexception:XSLCompiledTransform.Load(xslt) 未在 .net Core 2.1 目标框架中使用 </msxsl:script> 加载 xslt 文件

platformnotsupportedexception : XSLCompiledTransform.Load(xslt) not loading the xslt file with </msxsl:script> in .net Core 2.1 target framework

我有一个 xml 文件需要转换为 txt,为此我使用了 xslt 转换。 我的 xslt 转换文件在

中包含一些支持 javascript 的函数

如果我 运行 我在 .net Framework 4.5 及更高版本中的代码但相同的代码在 .net core 2.1 中失败,我可以成功转换文件。

.netcore 2.1 的文档显示对 xslt 转换的支持,但它对我不起作用,这是我缺少的任何东西。

我的输入XML:

   <?xml version="1.0" encoding="utf-8"?>
<Maps xmlns:xsi= "https://www.w3.org/TR/xmlschema-1/" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" xmlns= "http://www.semi.org">
<Map SubstrateId= "EMAXA191X0121" SubstrateType= "">
<Device MachineID= "M/C Name : AOI-404" BinType= "Decimal" NullBin= "099" Orientation= "0" OriginLocation= "2" Columns= "59" Rows= "41" CreateDate= "20190111.214309" ProductId= "EMAXA191X0121" LotId= "" WaferSize= "200">
<ReferenceDevice ReferenceDeviceX= "-1" ReferenceDeviceY= "-1" />
<Bin>
<Bin BinCode= "001" BinCount= "1565" BinQuality= "Pass" />
<Bin BinCode= "061" BinCount= "657" BinQuality= "Fail" />
<Bin BinCode= "062" BinCount= "11" BinQuality= "Fail" />
<Bin BinCode= "064" BinCount= "9" BinQuality= "Fail" />
<Bin BinCode= "065" BinCount= "1" BinQuality= "Fail" />
<Bin BinCode= "069" BinCount= "143" BinQuality= "Fail" />
</Bin>
<Data MapName= "MMI G85" Version= "1.0">
<Row> <![CDATA[061 001 061 061 001 061 061 001 061 061 001 061 061 069 061 061 001 061 061 061 061 061 061 001 061 001 061 061 099 099 099 001 001 061 001 061 061 001 001 001 001 001 061 001 001 001 001 001 061 001 061 001 001 061 061 001 061 061 061]]> </Row>
<Row> <![CDATA[061 001 061 061 001 061 001 001 061 061 061 061 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 061 061 001 061 069 001 001 001 001 001 061 061 001 001 001 001 001 061 001 001 061 001 001 061 061 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 061 001 001 001 001 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 061 001 061 001 069 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 069 061 061 061 061 061 061 061 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 001 061 001 001 001 001 001 001 001 001 001 001 061 061 061 001 001 001 001 001 001 061 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 061 001 001 001 001 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 001 061 061 001 001 069 001 061 061 061 001 061 069 001 061 001 061 061 001 001 061 001 061 061 061]]> </Row>
<Row> <![CDATA[069 001 061 001 001 001 001 061 001 001 001 001 001 001 001 061 061 061 061 001 061 061 001 001 001 001 001 001 001 069 001 001 001 069 001 069 001 001 001 001 001 069 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 001 061 001 061 061 001 061 001 069 001 061 001 001 061 061 001 061 001 001 001 001 001 061 061 061]]> </Row>
<Row> <![CDATA[061 061 001 061 001 001 061 001 001 061 001 001 001 001 061 001 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 001 061 069 001 001 001 001 001 001 069 061 061 001 061 061 001 001 061 001 001 001 061 061 061 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 061 001 001 061 001 001 001 061 061 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 001 061 001 001 001 001 061 001 061 001 069 001 061 001 061 001 001 001 001 061 001 001 001 001 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 069 001 001 001 069 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 061 061 061 061 001 061 061 001 061 061 061 001 061 001 001 061 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 001 001 001 001 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 061 001 061 061 061 061 061 061 061 061 001 061 061 061 061 061 001 001 001 001 001 061 001 061 001 001 001 061 061 001 001 061 001 001 061 001 001 001 001 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 061 001 001 001 001 061 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 069 001 069 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 001 001 001 001 001 001 069 001 069 069 069 001]]> </Row>
<Row> <![CDATA[001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 061 001 061 001 001 001 001 001 001 001 069 069 061 001 061 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 061 061 001 001 001 061 001 061 001 001 061 001 001 001 069 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 061 001 001 001 001 061 061 001 001 001 001 001 001 001 001 001 001 001 001 069 069]]> </Row>
<Row> <![CDATA[061 001 001 001 001 061 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 001 001 001 001 001 001 001 001 001 061 061 061]]> </Row>
<Row> <![CDATA[069 061 001 001 001 001 001 061 001 001 001 001 001 001 001 001 061 001 061 061 001 001 001 061 061 061 061 061 061 069 061 001 061 061 001 061 001 001 061 061 061 061 001 061 061 001 061 001 061 001 001 061 001 001 001 001 061 061 061]]> </Row>
<Row> <![CDATA[069 001 001 001 061 061 061 001 061 001 001 061 061 001 001 001 061 001 061 001 061 061 061 061 061 061 061 061 099 099 099 001 061 001 001 061 001 001 061 061 061 001 061 061 061 001 061 061 001 069 061 001 069 001 061 069 061 061 061]]> </Row>
<Row> <![CDATA[099 099 099 099 001 001 099 099 099 099 099 001 061 061 061 061 061 001 061 061 061 061 061 061 001 061 061 061 099 099 099 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 099 099 099 099 099 001 061 099 099 099 099]]> </Row>
<Row> <![CDATA[061 061 061 061 061 061 061 001 061 001 061 061 061 061 061 001 061 061 061 061 061 061 061 061 061 061 061 061 099 099 099 061 061 061 061 061 001 001 001 061 061 001 061 061 061 061 061 001 061 061 001 061 061 001 061 001 061 061 069]]> </Row>
<Row> <![CDATA[061 061 061 001 061 061 061 061 061 061 001 061 061 061 061 001 061 061 061 001 001 001 001 061 061 001 061 061 061 061 001 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 001 061 061 061]]> </Row>
<Row> <![CDATA[061 001 061 001 001 061 061 061 001 061 061 061 061 001 061 001 061 061 061 061 061 061 061 061 061 061 061 061 061 061 061 001 061 061 061 061 001 061 061 061 061 061 061 061 061 001 061 061 061 061 061 061 061 061 061 061 001 061 061]]> </Row>
<Row> <![CDATA[001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 061 061 001 001 001 069 061 001 001 001 001 001 001 001 001 001 001 061 061 061 061 061 001 069 001 001 001 001 061 001 001 061 001 069 069 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 069 001 001 065 001 001 001 001 001 001 069 069 001 001 069 001 001 001 001 001 001 069 061 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 069]]> </Row>
<Row> <![CDATA[001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 061 001 061 061 069 001 001 001 061 001 001 001 001 001 001 001 001 001 061 061 061 001 001 001 001 001 001 001 001 001 001 001 061 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 061 001 001 001 061 001 001 001 001 069 061 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 061 061 061 069 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 069 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 001 001 001 061 001 001 061 061 001 061 061 061 001 001 001 061 001 061 001 061 001 069]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 061 061 061 001 001 001 061 001 001 061 001 001 001 061 069 001 001 001 001 001 001 001 001 001 001 061 061 001 001 001 001 001 001 061 001 001 001 001 001 061 069 069 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 061 001 069 001 001 001 001 061 069 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 069 001 061 001 001 001 001 061 001 061 061 001 001 001 061 061 001 061 001 001 061 001 061 069 061 001 061 001 001 001 001 001 001 001 001 001 001 001 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 069 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 061 061 001 001 001 001 001 001 069 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 069 069 001 069 001 001 001 001 069 001 001 069 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001]]> </Row>
<Row> <![CDATA[069 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 001 001 001 001 069 001 001 001 001 001 001 061 069 001]]> </Row>
<Row> <![CDATA[069 069 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 061 061 069 069 069]]> </Row>
<Row> <![CDATA[069 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 001 069 001 001 001 001 001 001 001 001 001 001 064 062 062 062 062 064 064 064 062 062 062 062 064 064 001 001 001 001 001]]> </Row>
<Row> <![CDATA[001 001 069 001 001 069 001 001 001 001 001 001 001 001 001 001 001 069 069 001 001 001 001 001 001 001 001 001 099 099 099 001 001 001 001 001 001 062 062 064 001 001 001 001 001 001 001 001 001 001 001 001 001 001 064 062 064 001 061]]> </Row>
</Data>
</Device>
</Map>
</Maps>

我为转换设计的 XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsi= "https://www.w3.org/TR/xmlschema-1/" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns= "http://www.semi.org"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
                xmlns:outlet = "http://my.functions">



  <msxsl:script implements-prefix="outlet" language="javascript">
    <![CDATA[
    //script to replace string as XSLT1.0 doesnot support replace()
    function replace_str(str_text,str_by)
    {
    return str_text.replace(str_text,str_by);
    }

    //script to find the incoming bin code and idendify if pass/fail/null
    function identify_bin_type(available_bin_codes,search_string) {

    while(available_bin_codes.MoveNext()) {


    var current_bin_code = available_bin_codes.Current.Value;
    if ( current_bin_code === search_string){
    return current_bin_code;
    }
    }
    return "";
    }
    ]]>


  </msxsl:script>

  <xsl:strip-space elements="*"/>

  <!--variable section-->
  <xsl:variable name="Company_Name" select="'xxx'"/>
  <xsl:variable name="Notch_Direction" select="'DOWN'"/>
  <xsl:variable name="Device_Name" select="'EMAX-00'"/>
  <xsl:variable name="Pass_Bin_ASE_Code" select="'1'"/>
  <xsl:variable name="Fail_Bin_ASE_Code" select="'0'"/>
  <xsl:variable name="Null_Bin_ASE_Code" select="'X'"/>
  <xsl:variable name="Miss_Bin_ASE_Code" select="'0'"/>

  <xsl:variable name="Machine_Id" select="/node()[1]/node()[1]/node()[1]/@MachineID"/>

  <xsl:variable name="Wafer_Id" select="/node()[1]/node()[1]/@SubstrateId"/>

  <xsl:variable name="Bin1_Count" select="/node()[1]/node()[1]/node()[1]/node()[2]/*[@BinCode='001']/@BinCount"/>

  <xsl:variable name="Column_Value" select="/node()[1]/node()[1]/node()[1]/@Columns"/>
  <xsl:variable name="Row_Value" select="/node()[1]/node()[1]/node()[1]/@Rows"/>

  <xsl:variable name="Actual_Die_Nos" select="number($Column_Value) * number($Row_Value)"/>

  <xsl:variable name="Total_Die_Nos" select="sum(/node()[1]/node()[1]/node()[1]/node()[2]/*[@BinCount]/@BinCount)"/>

  <xsl:variable name="Device_Rows" select="/node()[1]/node()[1]/node()[1]/node()[3]/*/text()"/>

  <xsl:variable name="Pass_Bin_Codes" select="/node()[1]/node()[1]/node()[1]/node()[2]/*[@BinQuality='Pass']/@BinCode"/>
  <xsl:variable name="Fail_Bin_Codes" select="/node()[1]/node()[1]/node()[1]/node()[2]/*[@BinQuality='Fail']/@BinCode"/>
  <!--<xsl:variable name="Null_Bin_Codes" select="/node()[1]/node()[1]/node()[1]/node()[2]/*[@BinQuality='Null']/@BinCode"/>-->
  <xsl:variable name="Null_Bin_Codes" select="/node()[1]/node()[1]/node()[1]/@NullBin"/>


  <xsl:output method="text"  indent="yes"/>

  <!--Transpose template called for each Device Row Data-->
  <xsl:template name="find-identify-substitute-bincodes">
    <xsl:param name="string"/>

    <xsl:variable name="relevantSringLen" select="string-length($string)" />


    <xsl:if test="$relevantSringLen &gt; 1">
      <xsl:variable name="relevant-part" select="substring-before(substring-after($string,' '),' ')"/>



      <xsl:choose>

        <!--Check if it a pass bin code and replace with respective pass ASE Code-->
        <xsl:when test="contains(outlet:identify_bin_type($Pass_Bin_Codes,$relevant-part),$relevant-part)">

              <xsl:variable name="transform-relevant-part" select="outlet:replace_str($relevant-part,$Pass_Bin_ASE_Code)" />
              <xsl:value-of select="normalize-space(concat($transform-relevant-part,' '))"/>

        </xsl:when>


        <!--Check if it a fail bin code and replace with respective fail ASE Code-->

        <xsl:when test="contains(outlet:identify_bin_type($Fail_Bin_Codes,$relevant-part),$relevant-part)">

          <xsl:variable name="transform-relevant-part" select="outlet:replace_str($relevant-part,$Fail_Bin_ASE_Code)" />
          <xsl:value-of select="normalize-space(concat($transform-relevant-part,' '))"/>

        </xsl:when>



        <!--Check if it a null bin code and replace with respective null ASE Code-->

        <xsl:when test="contains(outlet:identify_bin_type($Null_Bin_Codes,$relevant-part),$relevant-part)">


              <xsl:variable name="transform-relevant-part" select="outlet:replace_str($relevant-part,$Null_Bin_ASE_Code)" />
              <xsl:value-of select="normalize-space(concat($transform-relevant-part,' '))"/>        

        </xsl:when>

        <!--Check if bin code not found and replace with respective miss ASE Code-->
        <xsl:otherwise>

          <xsl:variable name="transform-relevant-part" select="outlet:replace_str($relevant-part,$Miss_Bin_ASE_Code)" />
          <xsl:value-of select="normalize-space(concat($transform-relevant-part,' '))"/>


        </xsl:otherwise>
      </xsl:choose>

      <!--recursively look into the remainder string in the row and continue serch and replace till the end-->
      <xsl:variable name="remainder" select="substring-after($string,$relevant-part)"/>

      <xsl:call-template name="find-identify-substitute-bincodes">
        <xsl:with-param name="string" select="$remainder"/>
      </xsl:call-template>


    </xsl:if>

  </xsl:template>

  <!--Template of Device Data Rows to be called in main Template-->
  <xsl:template name="Devicedatarow">
    <xsl:for-each select="$Device_Rows">

      <xsl:variable name="Device_Row" select="current()"/>
      <xsl:variable name="Device_Row_Position" select="position()"/>


      <xsl:call-template name="find-identify-substitute-bincodes">
        <xsl:with-param name="string" select="$Device_Row" />

      </xsl:call-template>
      <xsl:text>&#xd;</xsl:text>
    </xsl:for-each>
  </xsl:template>

  <!--Main Text Template body-->
  <xsl:template match="/|@*">

    <xsl:text>Company Name: </xsl:text> 
    <xsl:value-of select="$Company_Name" />
    <xsl:text>&#xd;</xsl:text>

    <xsl:text>Device: </xsl:text>
    <xsl:value-of select="$Device_Name" />
    <xsl:text>&#xd;</xsl:text>

    <xsl:text>MachineID :</xsl:text>
    <xsl:value-of select="substring-after($Machine_Id, 'M/C Name :')" />

    <xsl:text>&#xd;</xsl:text>
    <xsl:text>Wafer ID: </xsl:text>
    <xsl:value-of select="$Wafer_Id" />

    <xsl:text>&#xd;</xsl:text>
    <xsl:text>BIN 1: </xsl:text>
    <xsl:value-of select="$Bin1_Count" />

    <xsl:text>&#xd;</xsl:text>
    <xsl:text>Total Die: </xsl:text>
    <xsl:value-of select="$Total_Die_Nos" />

    <xsl:text>&#xd;</xsl:text>
    <xsl:text>Notch Direction: </xsl:text>
    <xsl:value-of select="$Notch_Direction" />
    <xsl:text>&#xd;</xsl:text>

    <xsl:value-of select="concat('Column : ', $Column_Value, ', ' , ' Row : ', $Row_Value)" />
    <xsl:text>&#xd;</xsl:text>

    <xsl:text>Empty :</xsl:text>

    <xsl:text>&#xd;</xsl:text>
    <xsl:text>.............................................</xsl:text>
    <xsl:text>&#xd;</xsl:text>

    <xsl:call-template name="Devicedatarow">
    </xsl:call-template>

  </xsl:template>



</xsl:stylesheet>

我的预期输出:

Company Name: xxx
Device: EMAX-00
MachineID : AOI-404
Wafer ID: EMAXA191X0121
BIN 1: 1565
Total Die: 2386
Notch Direction: DOWN
Column : 59,  Row : 41
Empty :
.............................................
0100100100100000100000010100XXX1101001111101111101011001000
01001011000001000000000000001000010011111001111101101100000
01111111101111100000000000000001001111111111111111111111000
01111111111010000000000000000001001111111111111111111111000
01111101111111111100000000000000111111111111111011101010000
01111100000000010000000000000000011011111111110001111110000
01111110111101000000000000000001001001101000100101001101000
01011110111111100001001111111011101011111010111111111111111
01111111111111010000000000000001001010010101011001011111000
00101101101111011000000000000001001001111110001001101110001
01111011011100010000000000000001001011110101010101111011110
01111111111111111101111111111011101111110111111111111111000
01111111101111111000010010001011011111111111111110111111110
01111111111111111001000000001000001111101011100110110111100
01111101111011111101111111110101111111111101111111111010001
11111111111011111101111111111111111101111101011111110001011
01110011101011011101111111111011111111011110011111111111100
01111011111111111011111111111111111111111101111111111111000
00111110111111110100111000000001001011000010010101101111000
0111000101100111010100000000XXX1011011000100010010010100000
XXXX11XXXXX10000010000001000XXX00000000000000001XXXXX10XXXX
0000000101000001000000000000XXX0000011100100000100100101000
00010000001000010001111001000011000000000000000000000101000
01011000100001010000000000000001000010000000010000000000100
11111111111111110111111001110011111111110000010111101101001
01111111111111110101101111110011011111100111110111111111110
11111111111111111001111101000111011111111100011111111111011
01111111011101111001111111111011111111111111111110111100001
01111111111111111001111111111111011111110110010001110101010
01111111111101110001110110111001111111111001111110111110001
01111111111111111011111111111111111111111111011110101111001
01111111111111110101011110100111001011010001011111111111111
01111111111111111101111111111011111111101110111111111111111
01111111111111111101111111110011111111111111111111111111111
01111111111111111001111111110011111111111111111111111111111
01111111111111111011111111110011111111111111101001111110111
01111111111111111101111111110010111101101111111011111111111
01101111111111111111111111111011111111111111011110111111001
00101111111111111001111111111011111110111111111111111100000
01111111111111111011111111111011111111110000000000000011111
1101101111111111100111111111XXX1111110001111111111111100010

我的 .net 示例应用程序执行转换:

public static void RunXslt1(string currentInputXML,string currentOutputTXT,string transformxsltPath)
        {
            var fileInUse = "XSLT";
            try
            {
                Console.WriteLine(String.Format("starting XSLT process"));
                // Load the style sheet.
                var settings = new XsltSettings();
                settings.EnableScript = true;
                var xslt = new XslCompiledTransform();
                xslt.Load(transformxsltPath, settings, null);
                // Execute the transform and output the results to a file.
                fileInUse = "XML";
                xslt.Transform(currentInputXML, currentOutputTXT);
                Console.WriteLine(String.Format("Fail occurs on transformation."));
            }
            catch (FileNotFoundException ex)
            {
                if (fileInUse.Equals("XSLT"))
                {
                    Console.WriteLine("XSLT file not found.");
                    Environment.Exit(1);
                }
                else if (fileInUse.Equals("XML"))
                {
                    Console.WriteLine("XML file not found.");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Fail occurs on transformation. \nError : " + ex.Message);

            }
        }

此代码在 .net Framework 4.6 中完美运行,但如果我 运行 它在 .netCore 2.1 中,则以下几点会出现 platformnotsupportexception

 xslt.Load(transformxsltPath, settings, null);

System.PlatformNotSupportedException: Compiling JScript/CSharp scripts is not supported

.netCore 2.1 缺少什么? 我的xslt版本是1.0, Visual studio 2017,target Framework .netcore2.1 我尝试了很多建议,但似乎没有任何效果 请协助我,

根据 dotnet corefx github 存储库,.NET Core 不支持该功能,目前没有实现它的计划。 可以找到更多详细信息here

不幸的是,目前看来您唯一的选择是坚持使用 .NET Framework。

编辑

我确实喜欢挑战,所以我研究了您的 XSLT 并找到了一个可以 运行 在 .NET Core 中的解决方案。

我们需要删除 JScript 才能消除该错误。所以我们需要用 XSLT 方法替换您的 JScript 方法。

为了删除 replace-str 我环顾四周,发现了一个 XSLT 模板,可以为您替换字符串。这是 answer I used

将模板添加到您的 XSLT

<xsl:template name="string-replace-all">
  <xsl:param name="text" />
  <xsl:param name="replace" />
  <xsl:param name="by" />
  <xsl:choose>
    <xsl:when test="contains($text, $replace)">
      <xsl:value-of select="substring-before($text,$replace)" />
      <xsl:value-of select="$by" />
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text" select="substring-after($text,$replace)" />
        <xsl:with-param name="replace" select="$replace" />
        <xsl:with-param name="by" select="$by" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

并用答案中的示例替换您的 replace_str 调用

<xsl:variable name="transform-relevant-part">
  <xsl:call-template name="string-replace-all">
    <xsl:with-param name="text" select="$relevant-part" />
    <xsl:with-param name="replace" select="$relevant-part" />
    <xsl:with-param name="by" select="$Pass_Bin_ASE_Code" />
  </xsl:call-template>
</xsl:variable>

现在,您的 when 子句不需要 identify_bin_type JScript 函数来查找任何匹配项,您可以使用 XSLT contains 方法为您查找匹配项:

<xsl:when test="contains($Pass_Bin_Codes, $relevant-part)">

这应该会产生所需的输出。

我知道这是一个老问题,但我只是想与其他有同样问题的人分享这个问题,不能只更改所有转换。

长话短说 > 还是有可能的。
但是:您需要自己做一些工作,因为它不是开箱即用的。

第 1 部分:注入 'fixed' 代码

假设您有这段非常有用的代码,您希望从转换内部调用它:

public class TransformationHelperV1 {    
   private int counter = 0;    
   public int Increment() {
      return counter++;    
   }
}

那么这就是将代码添加到 xslt-engine:

public class XslTransformator
{
    public string Transform(string xml, string xslt)
    {
        var output = new StringBuilder();

        using (var xslReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(xslt))))
        {
            var doc = new XmlDocument();
            doc.LoadXml(xml);

            using (var xmlWriter = XmlWriter.Create(output))
            {
                var args = new XsltArgumentList();
                args.AddExtensionObject("xxx:helpers/v1", new TransformationHelperV1());

                var engine = new XslCompiledTransform();
                engine.Load(xslReader);
                engine.Transform(doc, args, xmlWriter);
            }

            return output.ToString();
        }
    }
}

注意我们如何添加链接到我们可以选择自己的命名空间的扩展对象。 一旦你有了它,你就可以在这样的转换中使用它:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:scripts="xxx:helpers/v1"
  version="1.0">
  <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="yes" />

  <xsl:template match="/">
    <books first="100">
      <xsl:for-each select="//book">
        <xsl:variable name="idx">
          <xsl:value-of select="scripts:Increment()"/>
        </xsl:variable>
        <xsl:if test="$idx &lt; 100">
          <title>
            <xsl:value-of select="title"/>
          </title>
        </xsl:if>
      </xsl:for-each>
    </books>
  </xsl:template>
</xsl:stylesheet>

现在请注意,我们将 xml-namespace“脚本”链接到代码中定义的命名空间。从那一刻起,您就可以使用该脚本中提供的功能了。

第 2 部分:动态脚本...

在第 1 部分中,我解释了如何使对象具有可用于转换的函数。 但那是一个“硬编码”的对象。 您真正想要的是一个“动态”对象,其代码存在于 xslt 本身中。

这意味着您将必须:

  1. 执行“pre-processing”步骤
    并从 xslt.
  2. 中检测这些脚本
  3. 然后编译它们。
  4. 最后将它们作为 ExtensionObject 注入到 XsltArgumentList 中。

这里的代码有点多。 相反,一些有趣的指针 :)