2017-06-12 148 views
1

我在做一個非常標準的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

回答

2

實驗中氧氣XML v17.1有點表明,在您的XSL簡單的改也改不掉那令人討厭的換行符。

在你的XSL代碼行31,你有單指令插入<Schedule>元素,跟着一個換行符,和第32行:

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

在第31行的末尾刪除換行,所以該行31和32線組合看起來像這個:

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

從理論上講,這應該是相同的功能,但舊MSXML版本似乎有點奇特。