使用MSXML进行XSL转换和标记之间的空白

问题描述:

我在做一个非常标准的XSLT转换。当使用MSXML(以氧XML编辑器),我获得以下的输出:使用MSXML进行XSL转换和标记之间的空白

<?xml version="1.0" encoding="UTF-8"?> 
<ProgramSchedules mediaCompanyID="00001" date="2017-06-08" channel="00019"> 
<Schedules> 
<Schedule contentId="T17ADiamond008P2AA" startTime="06:29:56" endTime="06:30:11" rerun="true" eventType="AP"> 
</Schedule> 
<Schedule contentId="T17AOslo-Sk236s1AA" startTime="06:30:11" endTime="06:30:31" rerun="true" eventType="AP"> 
</Schedule> 

MSXML 4和萨克森显示输出如下:

<?xml version="1.0" encoding="UTF-8"?> 
<ProgramSchedules mediaCompanyID="00001" date="2017-06-08" channel="00019"> 
<Schedules> 
<Schedule contentId="T17ADiamond008P2AA" startTime="06:29:56" endTime="06:30:11" rerun="true" eventType="AP"></Schedule> 
<Schedule contentId="T17AOslo-Sk236s1AA" startTime="06:30:11" endTime="06:30:31" rerun="true" eventType="AP"></Schedule> 

这里的问题是,我的XML模式不验证第一输出,因为在开始标记之后存在CRLF。

有没有办法解决这个问题,而不改变处理器?

这里是我的样式表的样子:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <ProgramSchedules> 
      <xsl:attribute name="mediaCompanyID"> 
       <xsl:text>00001</xsl:text> 
      </xsl:attribute> 
      <xsl:attribute name="date"> 
       <xsl:apply-templates select="txevents/search-criteria/dateselection/ES_DATESELECTION/firstvalue/ESP_DATE"/> 
      </xsl:attribute> 
      <xsl:attribute name="channel"> 
       <xsl:choose> 
        <xsl:when test="starts-with(txevents/ES_BMTXEVENT/channel/ESP_CHANNEL/@name, 'NRK1')"> 
         <xsl:text>00019</xsl:text> 
        </xsl:when> 
        <xsl:when test="txevents/ES_BMTXEVENT/channel/ESP_CHANNEL/@name = 'NRK2'"> 
         <xsl:text>00029</xsl:text> 
        </xsl:when> 
        <xsl:when 
         test="txevents/ES_BMTXEVENT/channel/ESP_CHANNEL/@name = 'NRK3' or txevents/ES_BMTXEVENT/channel/ESP_CHANNEL/@name = 'SUPER'"> 
         <xsl:text>00039</xsl:text> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:text>0</xsl:text> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:attribute> 
      <Schedules> 
       <xsl:for-each select="txevents/ES_BMTXEVENT"> 
        <Schedule> 
         <xsl:attribute name="contentId"> 
          <xsl:value-of select="translate(@productcode, '/', '')"/> 
          <xsl:value-of select="substring(transmission/ES_TRANSMISSION/@productVersionAsString, 2, 4)"/> 
         </xsl:attribute> 
         <xsl:attribute name="startTime"> 
          <xsl:apply-templates select="starttime/ESP_TIMEDURATION"/> 
         </xsl:attribute> 
         <xsl:attribute name="endTime"> 
          <xsl:apply-templates select="endtime/ESP_TIMEDURATION"/> 
         </xsl:attribute> 
         <xsl:attribute name="rerun"> 
          <xsl:choose> 
           <xsl:when 
            test="(transmission/ES_TRANSMISSION/@tx_isrepeat = 'true') or (transmission/ES_TRANSMISSION/@tx_isrerun = 'true')"> 
            <xsl:text>true</xsl:text> 
           </xsl:when> 
           <xsl:otherwise> 
            <xsl:text>false</xsl:text> 
           </xsl:otherwise> 
          </xsl:choose> 
         </xsl:attribute> 
         <xsl:attribute name="eventType"> 
          <xsl:choose> 
           <xsl:when 
            test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Segment of program'"> 
            <xsl:text>RP</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Trailer'"> 
            <xsl:text>AP</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Sting/Vignett'"> 
            <xsl:text>RP</xsl:text> 
           </xsl:when> 
           <xsl:when 
            test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Klokke NRK1 m/ tekst'"> 
            <xsl:text>IF</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Klokke NRK Super'"> 
            <xsl:text>IF</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Klokke NRK2'"> 
            <xsl:text>IF</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Plakater 3'"> 
            <xsl:text>IF</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'A1 fl on'"> 
            <xsl:text>AP</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'Sponsor'"> 
            <xsl:text>BR</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'TTV-rulle NRK1'"> 
            <xsl:text>IF</xsl:text> 
           </xsl:when> 
           <xsl:when test="timeallocation/ES_BMTIMEALLOCATION/type/ESP_BMTIMEALLOCATIONTYPE/@name = 'TTV-rulle NRK2'"> 
            <xsl:text>IF</xsl:text> 
           </xsl:when> 
           <xsl:otherwise> 
            <xsl:text>US</xsl:text> 
           </xsl:otherwise> 
          </xsl:choose> 
         </xsl:attribute></Schedule> 
       </xsl:for-each> 
      </Schedules> 
     </ProgramSchedules> 
    </xsl:template> 

    <xsl:template match="ESP_TIMEDURATION"> 
     <xsl:value-of select="format-number(@hours, '00')"/> 
     <xsl:text>:</xsl:text> 
     <xsl:value-of select="format-number(@minutes, '00')"/> 
     <xsl:text>:</xsl:text> 
     <xsl:value-of select="format-number(@seconds, '00')"/> 
    </xsl:template> 

    <xsl:template match="ESP_DATE"> 
     <xsl:value-of select="@year"/> 
     <xsl:text>-</xsl:text> 
     <xsl:value-of select="format-number(@month, '00')"/> 
     <xsl:text>-</xsl:text> 
     <xsl:value-of select="format-number(@day, '00')"/> 
    </xsl:template> 
    <xsl:template match="ESP_TIMEINSTANT"> 
     <xsl:value-of select="@year"/> 
     <xsl:text>-</xsl:text> 
     <xsl:value-of select="format-number(@month, '00')"/> 
     <xsl:text>-</xsl:text> 
     <xsl:value-of select="format-number(@day, '00')"/> 
    </xsl:template> 

</xsl:stylesheet> 

原始XML数据是在这里:https://pastebin.com/RWGEi59c

+1

你能否在这种情况下显示你的输入XML?谢谢! –

+0

已添加输入数据 – wasmachien

实验中氧气XML v17.1有点表明,在您的XSL简单的改也改不掉那令人讨厌的换行符。

在你的XSL代码行31,你有单指令插入<Schedule>元素,跟着一个换行符,和第32行:

   <Schedule> 
        <xsl:attribute name="contentId"> 

在第31行的末尾删除换行,所以该行31和32线组合看起来像这个:

   <Schedule><xsl:attribute name="contentId"> 

从理论上讲,这应该是相同的功能,但旧MSXML版本似乎有点奇特。