2 Stimmen

korrekte Syntax für eine xslt-Transformation

Hier ist mein Code, ich erhalte einen Fehler, wenn ich versuche und parsen meine Xml und Xslt-Datei, aber ich möchte nur wissen, ob meine Syntax / Code für die Transformation korrekt ist. Ich erhalte eine Ausnahme mit etwas wie - Seite \r\n

Mit Visual Studio, wenn ich die xslt-Transformation manuell testen alles funktioniert...

var XslFo = XElementPassedInAsAParamOrSomething;

                //load the xsl
                XslCompiledTransform xslTrans = new XslCompiledTransform();
                using (XmlReader reader = XslFo.CreateReader())
                {
                    xslTrans.Load(reader);
                }

                //create the output stream
                MemoryStream result = new MemoryStream();

                //do the actual transform of xml
                using (XmlReader reader = XmlData.CreateReader())
                {
                    xslTrans.Transform(reader, null, result);
                }

                //return result as XElement (for dumping  db etc)
                using (XmlReader reader = XmlReader.Create(result))
                {
                    return XElement.Load(reader);
                }

HINWEIS: Meine Ausnahme ist "Root Element is missing".

EDIT: Danke Dimitri - ich werde Ihren Code überprüfen müssen, aber nur der Klarheit halber denke ich, dass es am besten ist, wenn ich meinen Code zur Verfügung stelle:

Ich lade meine beiden Xmls über Embedded resourse (falls das einen Unterschied macht)

Xml:

    <html>   
<head>
        <title>Spanish Review Handbook</title>   
</head>   
<body>
        <h3>Introduction</h3>
        <p>
          This handbook covers the major topics in Spanish, but is by
          no means complete.
        </p>   
</body> 
</html>

Xsl:

 <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:fo="http://www.w3.org/1999/XSL/Format"
                    version="1.0">

      <xsl:output method="xml" indent="yes"/>
      <xsl:variable name="pagewidth" select="21.5"/>
      <xsl:variable name="bodywidth" select="19"/>
      <xsl:template match="html">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

      <fo:layout-master-set>
        <fo:simple-page-master master-name="leftPage"
          page-height="27.9cm"
          page-width="{$pagewidth}cm"
          margin-left="1cm"
          margin-right="2cm"
          margin-top="1cm"
          margin-bottom="1cm">
          <fo:region-before extent="1cm"/>
          <fo:region-after extent="1cm"/>
          <fo:region-body
            margin-top="1cm"
            margin-bottom="1cm" />
        </fo:simple-page-master>

        <fo:simple-page-master master-name="rightPage"
          page-height="27.9cm"
          page-width="{$pagewidth}cm"
          margin-left="2cm"
          margin-right="1cm"
          margin-top="0.5cm"
          margin-bottom="0.5cm">
          <fo:region-before extent="1cm"/>
          <fo:region-after extent="1cm"/>
          <fo:region-body
            margin-top="1cm"
            margin-bottom="1cm" />
        </fo:simple-page-master>

        <!-- Set up the sequence of pages -->
        <fo:page-sequence-master master-name="contents">
          <fo:repeatable-page-master-alternatives>
            <fo:conditional-page-master-reference
              master-name="leftPage"
              odd-or-even="odd"/>
            <fo:conditional-page-master-reference
              master-name="rightPage"
              odd-or-even="even"/>
          </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
      </fo:layout-master-set>

      <fo:page-sequence master-name="contents" initial-page-number="1">
        <xsl:apply-templates />
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

  <xsl:template match="body">
    <fo:flow flow-name="xsl-region-body">
      <xsl:apply-templates/>
    </fo:flow>
  </xsl:template>

  <xsl:template match="h3">
    <fo:block font-size="14pt" font-weight="bold"
      space-before="6pt">
      <xsl:apply-templates/>
    </fo:block>
  </xsl:template>

  <xsl:template match="p">
    <fo:block text-indent="1em"
      space-before="4pt" space-after="4pt">
      <xsl:apply-templates/>
    </fo:block>
  </xsl:template>

  <xsl:template match="b">
    <fo:inline font-weight="bold">
      <xsl:apply-templates/>
    </fo:inline>
  </xsl:template>

  <xsl:template match="i">
    <fo:inline font-style="italic">
      <xsl:apply-templates/>
    </fo:inline>
  </xsl:template>

</xsl:stylesheet>

2voto

Dimitre Novatchev Punkte 234995

Die Ausnahme zeigt Ihnen deutlich den Grund des Problems : "Wurzelelement fehlt".

Das bedeutet, dass Sie versuchen, etwas als XML zu parsen, das kein oberstes Element hat (wahrscheinlich hat es mehr als ein Element auf der obersten Ebene).

Dies kann an drei Stellen in Ihrem Code geschehen (es ist nicht möglich zu sagen, welche, da Sie weder das XML-Quelldokument noch das XSLT-Stylesheet oder das Ergebnis der Transformation zur Verfügung gestellt haben):

Hier (im xslt-Stylesheet fehlt möglicherweise ein top-Element):

using (XmlReader reader = XslFo.CreateReader())                 
{                     
  xslTrans.Load(reader);                 
}  

Hier (in der XML-Quelle fehlt möglicherweise ein Top-Element):

using (XmlReader reader = XmlData.CreateReader())                    
{                        
  xslTrans.Transform(reader, null, result);                    
} 

Und hier (dem Ergebnis der Umwandlung fehlt möglicherweise ein oberes Element):

using (XmlReader reader = XmlReader.Create(result))                     
{                         
  return XElement.Load(reader);                     
}  

Nach meiner Erfahrung ist es sehr wahrscheinlich, dass der Fehler beim letzten Codeschnipsel auftritt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X