2017-06-12 4 views
1

Ich mache eine ziemlich Standard-XSLT-Transformation. Wenn MSXML mit (in Oxygen XML-Editor), bekomme ich folgende Ausgabe:XSL-Transformation mit MSXML und Leerzeichen zwischen den Tags

<?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 und Saxon zeigen folgende Ausgabe:

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

Das Problem hier ist, dass mein XML-Schema überprüft nicht die erste Ausgabe wegen der CRLF, die nach dem öffnenden Tag vorhanden ist.

Gibt es eine Möglichkeit, dies zu lösen, ohne den Prozessor zu wechseln?

Hier ist, was mein Sheet wie folgt aussieht:

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

Raw XML-Daten sind hier: https://pastebin.com/RWGEi59c

+1

Können Sie in diesem Fall auch Ihre Eingabe-XML anzeigen? Vielen Dank! –

+0

Eingabedaten hinzugefügt – wasmachien

Antwort

2

Ein wenig Experimentieren in Oxygen XML v17.1 zeigt, dass eine einfache Änderung in Ihrer XSL loswerden von dieser nervigen Newline.

Zeile 31 des XSL-Code, haben Sie den einzelnen Befehl ein <Schedule> Element eingefügt werden, durch eine neue Zeile gefolgt, und Linie 32:

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

das Newline entfernen am Ende der Linie 31, so dass die Leitung 31 und die Leitung 32 werden kombiniert, wie diese Stelle zu suchen:

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

Theoretisch sollte dies funktional äquivalent sein, aber ältere MSXML-Versionen erscheinen ein wenig eigenwillig sein.

Verwandte Themen