[C#] Xslt transform met namespaces.

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 08:47

ElCondor

Geluk is Onmisbaar

Topicstarter
Ik heb een API gemaakt die een folderstructuur uitleest en deze in XML aanlevert in een specifiek format.
Voor mijn Comic reader website heb ik een MVC site gemaakt die deze XML gebruikt om er een html pagina van te maken. Nu heb ik de API zo aangepast dat hij een default namespace meegeeft in de XML.
Sindsdien mislukt de transform. Zie hieronder de XML, Xslt en de code die ik gebruik.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
<folder xmlns="http://www.de-baay.nl/ComicCloud" name="pub" files="2149" totalPages="215" currentPage="3">
<file name="alex12.cbr" path="\Alex\alex12.cbr"/>
<file name="alex13.cbr" path="\Alex\alex13.cbr"/>
<file name="alex14.cbr" path="\Alex\alex14.cbr"/>
<file name="alex15.cbr" path="\Alex\alex15.cbr"/>
<file name="alex16.cbr" path="\Alex\alex16.cbr"/>
<file name="alex17.cbr" path="\Alex\alex17.cbr"/>
<file name="alex18.cbr" path="\Alex\alex18.cbr"/>
<file name="alex19.cbr" path="\Alex\alex19.cbr"/>
<file name="alex20.cbr" path="\Alex\alex20.cbr"/>
<file name="alex21.cbr" path="\Alex\alex21.cbr"/>
</folder>


XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:debaay="http://www.de-baay.nl/ComicCloud" 
    exclude-result-prefixes="msxsl debaay">
    
  <xsl:output method="html" indent="yes"/>
  <xsl:param name="requestUrl"/>
  <xsl:param name="apiLocation"/>

  <!--Content table generation -->

  <xsl:template match="/">
    <div id="ComicTable">
      <xsl:apply-templates/>
    </div>
  </xsl:template>

  <xsl:template match="debaay:file">
    <div class="ComicCell">
      <a>
        <xsl:attribute name="href">
          <xsl:value-of select="$requestUrl"/>
          <xsl:text>Comic/Read</xsl:text>
          <xsl:value-of select="@path"/>
          <xsl:text>/0</xsl:text>
        </xsl:attribute>
        <p class="ComicThumbnail">
          <img alt="thumbnail">
            <xsl:attribute name="src">
              <xsl:value-of select="$apiLocation"/>
              <xsl:text>?file=</xsl:text>
              <xsl:value-of select="@path"/>
              <xsl:text>&amp;page=0&amp;size=150</xsl:text>
            </xsl:attribute>
          </img>
        </p>
        <p class="ComicLink">
          <xsl:value-of select="@name"/>
        </p>
      </a>
    </div>
  </xsl:template>

</xsl:stylesheet>


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            TextReader result = new StringReader(tempresult.ToString());
            //Prepare the result table
            StringWriter resultTable = new StringWriter();
            XsltArgumentList argList = new XsltArgumentList();
            //Pass requestUrl and apiLocation as parameters to the XslStylesheet. Needed to build links to the actual Comics
            argList.AddParam("requestUrl", "", conf.SiteRoot);
            argList.AddParam("apiLocation", "", conf.ApiLocation);
            //Build the comicList to pass to the XslStylesheet.
            XPathDocument comicList = new XPathDocument(result);
            //Transform the comicList and set ResultTables property with the result.
            XslCompiledTransform transform = new XslCompiledTransform();
            var trans = HostingEnvironment.MapPath(@"~\Views\Home\FolderTable.xslt");
            transform.Load(trans);
            transform.Transform(comicList, argList, resultTable);


Als ik de XML en de Xslt in een online transformer tool zoals deze gooi dan krijg ik netjes een tabel in html die ik verwacht:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<div id="ComicTable">

<div class="ComicCell">
<a href="Comic/Read\Alex\alex12.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex12.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex12.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex13.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex13.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex13.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex14.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex14.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex14.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex15.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex15.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex15.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex16.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex16.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex16.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex17.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex17.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex17.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex18.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex18.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex18.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex19.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex19.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex19.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex20.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex20.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex20.cbr</p>
</a>
</div>

<div class="ComicCell">
<a href="Comic/Read\Alex\alex21.cbr/0">
<p class="ComicThumbnail">
<img alt="thumbnail" src="?file=\Alex\alex21.cbr&amp;page=0&amp;size=150"></p>
<p class="ComicLink">alex21.cbr</p>
</a>
</div>

</div>


Echter het resultaat in mijn transform in code levert alleen een lege <div id="ComicTable"> op.
Ik heb het vermoeden dat ik in mijn code de namespace die ik gedefiniëerd heb in mijn XML/Xslt nog moet verwerken of meegeven als argument aan de transform, maar ik kan zo even niet zeggen op welke manier je dit dan doet.

Ik heb op deze link wel iets over het opnemen van namespaces en objects in de Transform argumentlist gevonden, maar dan moet je ook een object meegeven en die heb ik eigenlijk niet, want ik heb alleen het resultaat van de transform nodig, niet specifiek een object vanuit de transform.

Kan iemand mij hierbij helpen of advies geven hoe ik dit aanpak?

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)

Beste antwoord (via ElCondor op 23-06-2018 19:20)


  • -Sybren
  • Registratie: Juli 2014
  • Laatst online: 10-06-2024
Ik heb je een testprojectje gemaakt met je bestanden en de output lijkt mij correct. Ik ga er vanuit dat in tempresult de XML zit zoals door jou gepost?

C#

C#:
1
2
3
4
5
6
7
8
9
10
11
12
//Prepare the result table
            StringWriter resultTable = new StringWriter();
            XsltArgumentList argList = new XsltArgumentList();
            //Pass requestUrl and apiLocation as parameters to the XslStylesheet. Needed to build links to the actual Comics
            argList.AddParam("requestUrl", "", "test");
            argList.AddParam("apiLocation", "", "test");
            //Build the comicList to pass to the XslStylesheet.
            XPathDocument comicList = new XPathDocument("XML.xml");
            //Transform the comicList and set ResultTables property with the result.
            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load("XSLT.xslt");
            transform.Transform(comicList, argList, resultTable);


Output HTML

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div id="ComicTable">
  <div class="ComicCell"><a href="testComic/Read\Alex\alex12.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex12.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex12.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex13.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex13.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex13.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex14.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex14.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex14.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex15.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex15.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex15.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex16.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex16.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex16.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex17.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex17.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex17.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex18.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex18.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex18.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex19.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex19.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex19.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex20.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex20.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex20.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex21.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex21.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex21.cbr</p></a></div>
</div>


Resultaat is dus

C#:
1
resultTable.ToString();

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • -Sybren
  • Registratie: Juli 2014
  • Laatst online: 10-06-2024
Ik heb je een testprojectje gemaakt met je bestanden en de output lijkt mij correct. Ik ga er vanuit dat in tempresult de XML zit zoals door jou gepost?

C#

C#:
1
2
3
4
5
6
7
8
9
10
11
12
//Prepare the result table
            StringWriter resultTable = new StringWriter();
            XsltArgumentList argList = new XsltArgumentList();
            //Pass requestUrl and apiLocation as parameters to the XslStylesheet. Needed to build links to the actual Comics
            argList.AddParam("requestUrl", "", "test");
            argList.AddParam("apiLocation", "", "test");
            //Build the comicList to pass to the XslStylesheet.
            XPathDocument comicList = new XPathDocument("XML.xml");
            //Transform the comicList and set ResultTables property with the result.
            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load("XSLT.xslt");
            transform.Transform(comicList, argList, resultTable);


Output HTML

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div id="ComicTable">
  <div class="ComicCell"><a href="testComic/Read\Alex\alex12.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex12.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex12.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex13.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex13.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex13.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex14.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex14.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex14.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex15.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex15.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex15.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex16.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex16.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex16.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex17.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex17.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex17.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex18.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex18.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex18.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex19.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex19.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex19.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex20.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex20.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex20.cbr</p></a></div>
  <div class="ComicCell"><a href="testComic/Read\Alex\alex21.cbr/0"><p class="ComicThumbnail"><img alt="thumbnail" src="test?file=\Alex\alex21.cbr&amp;page=0&amp;size=150"></p>
      <p class="ComicLink">alex21.cbr</p></a></div>
</div>


Resultaat is dus

C#:
1
resultTable.ToString();

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 08:47

ElCondor

Geluk is Onmisbaar

Topicstarter
Ja, inderdaad, daar zit de opgehaalde XML in.
Dus het lijkt bij jou wel goed te gaan? Vreemd. Ik heb namelijk geprobeerd het transformeren te debuggen, maar dat werkte om de een of andere reden niet.
Als ik echter het resultaat bekijk (resultTable) dan zie ik alleen de ComicTable div, zonder inhoud... :?

Zit nu ff op kantoor, maar zal vanavond eens even opnieuw debuggen.

[ Voor 10% gewijzigd door ElCondor op 22-06-2018 08:33 ]

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 08:47

ElCondor

Geluk is Onmisbaar

Topicstarter
Tjsa, wat kan ik zeggen. Ik was vergeten dat ik verderop in de code de binnengetrokken XML nog nabewerkte om er een subset uit te halen. Daarbij gooide ik alle namespace en verder attribuut data overboord...

#facepalm #kneus Dus ik heb deze code nu ook aangepast en de XDoc wordt nu netjes inclusief namespace attributen opgebouwd. Daarmee verloopt de tranfsorm ook zoals verwacht.

Bedankt voor het meedenken allemaal.

Als er andere mensen hier komen zoeken en willen weten hoe ze een valide van namespace voorziene XDocument opbouwen, stuur me dan even een PB.

:)

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • +1 Henk 'm!

  • -Sybren
  • Registratie: Juli 2014
  • Laatst online: 10-06-2024
Mooi dat het is opgelost :)