Toon posts:

[.Net] XSLTransform issue

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik voer een simpele xsltransformatie over een stuk xml uit. Het resultaat van de transformatie is niet goed. Het gaat om een lege node die tijdens de transformatie niet geraakt wordt.

(gedeelte xml) voor transformatie:
code:
1
2
3
4
5
6
7
<Straatadres>
  <Locatieoms/>
  <Woonplaatsnaam>AMSTERDAM</Woonplaatsnaam>
  <Straatnaam>BOSWEG</Straatnaam>
  <Huisnr>00001</Huisnr>
  <Huisnrtoevoeging/>
</Straatadres>


de xml na de transformatie:
code:
1
2
3
4
5
6
7
8
9
<Straatadres>
  <Locatieoms>
  </Locatieoms>
  <Woonplaatsnaam>AMSTERDAM</Woonplaatsnaam>
  <Straatnaam>BOSWEG</Straatnaam>
  <Huisnr>00001</Huisnr>
  <Huisnrtoevoeging>
  </Huisnrtoevoeging>
</Straatadres>


Zoals je ziet komen de lege nodes er niet goed door.
Dit zou moeten worden:

code:
1
2
3
4
5
<Huisnrtoevoeging></Huisnrtoevoeging>

of

<Huisnrtoevoeging/>


Wie heeft er een oplossing?

  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

is het erg dat ze er met <object></object> in staan? In principe betekend het hetzelfde toch??

(bt, hoe komt die output eruit want kan me niet voorsetllen dat een xml object dat maakt, doe je string transforamties? en wat doet je xsl allemaal??

Of niet natuurlijk...


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:54
Hoezo , ze komen er niet goed door ?
AFAIK maak het niet uit of het nu
code:
1
< /nodet>

code:
1
<node></node>

of
code:
1
2
<node>
</node>

is.
Er staat niks in, behalve een whitespace, en dan is het de XML die zegt hoe die whitespace moet behandeld worden.

https://fgheysels.github.io/


Verwijderd

Topicstarter
code:
1
2
3
4
<Straatadres>
  <Huisnrtoevoeging>
  </Huisnrtoevoeging>
</Straatadres>


Tussen de begin- en endtag van Huisnrtoevoeging staat een newline en whitespaces. De validatie die op de uiteindelijke xml plaats vindt loopt stuk omdat deze newline en whitespaces als een string gezien wordt.

dit is de xslt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="node()">
  <xsl:apply-templates select="node()"/>
</xsl:template>
<xsl:template match="Arbeidsverhouding">
  <xsl:copy>
    <xsl:apply-templates select="node()" mode="copy"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="node()" mode="copy">
  <xsl:copy>
    <xsl:apply-templates select="node()" mode="copy"/>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>


Ik kan ident wel op "no" zetten, maar dan komt er een niet opgemaakt stuk xml uit (zonder CR's).

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:54
Kan je niets doen met xml:space ?

https://fgheysels.github.io/


  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
Dump even de .NET code die je gebruikt om te transformeren. Je kunt dit waarschijnlijk oplossen door gebruik te maken van (Xml)TextWriter class.

Verwijderd

Topicstarter
Hier de code van de transformatie.
Het XSLTransform object wordt via een accessor in de aggregation class aangeroepen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
XmlTextReader tr = new XmlTextReader(xmlfrag, XmlNodeType.Document, null);

XPathDocument doc2 = new XPathDocument(tr);
XPathNavigator nav2 = doc2.CreateNavigator();

MemoryStream memstream = new MemoryStream();
aggregation.XSLTransform.Transform(nav2, null, memstream, null);
memstream.Position = 0;
using (StreamReader r = new StreamReader(memstream))
{
  resultxml = r.ReadToEnd();
}

  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
Zet eens je WhitespaceHandling op none:

C#:
1
2
3
4
5
XmlTextReader tr = new XmlTextReader(xmlfrag, XmlNodeType.Document, null);
tr.WhitespaceHandling = WhitespaceHandling.None;

// rest van je code volgt hier
...

Verwijderd

Topicstarter
Voor zover ik kan zien heeft dat geen resultaat.

Verwijderd

Topicstarter
Ik heb nog eens goed gekeken naar de WhiteSpaceHandling property. Het zit 'm hier niet in.

Het probleem zit jammergenoeg in de .Net XSLTransformer.

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Stelletje lamme takken daar bij Microsoft... :P
[b][message=25474478,noline]sten schreef op woensdag 29 maart 2006 @ 13:41[/message
Ik kan ident wel op "no" zetten, maar dan komt er een niet opgemaakt stuk xml uit (zonder CR's).
Bedoel je hiermee dat met indent = no de lege nodes wel goed afgehandeld worden, of gaat het dan ook mis?

En mocht indent = no wel het juiste resultaat geven wbt lege nodes, wat is er dan precies verkeerd aan niet opgemaakte xml? Ik neem aan dat diegene/hetgene wat dit fragment moet inlezen het verder niet uitmaakt of de xml wel of niet opgemaakt is?

  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
Kijk even hier voor een vergelijkbare probleem en een mogelijke oplossing:
http://www.mcse.ms/message1007196.html

Ik heb helaas niet de beschikking over VS.NET op mijn werk en kan het zelf nu niet uitzoeken.

  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
Is het je inmiddels gelukt? Ik heb eventueel een werkende project voor je als je wilt.

Verwijderd

Topicstarter
Ik heb het opgelost door de opmaak in de xslt output tag uit te zetten. De ontvangende partij slikt de XML op deze manier wel.

Als je code hebt om de lege nodes op een andere manier te schrijven zie ik dat graag tegemoet. Volgens mij kan het (ook) worden opgelost door een wrapper op een XmlTextWriter te bouwen.

  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
Hieronder de voorbeeld code. Het gaat voornamelijk om de class XmlTextWriterEE, subclass van XmlTextWriter die de methode WriteFullEndElement uit de base class anders implementeert.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// filename: Sample.cs
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

public class Sample {
    private const String filename = "../../myData.xml";
    private const String stylesheet = "../../myStyleSheet.xslt";

    public static void Main() {
        XslTransform xslt = new XslTransform();
        xslt.Load(stylesheet);
        XPathDocument xpathdocument = new XPathDocument(filename);
        XmlTextWriterEE writer = new XmlTextWriterEE(Console.Out);
        
        writer.Formatting=Formatting.Indented;

        xslt.Transform(xpathdocument, null, writer, null);
    }
}

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// filename: XmlTextWriterEE.cs
using System;
using System.IO;
using System.Xml;

/// <summary>
/// Wrapper that forces more compact empty element end
/// tags to be written as full end tags whenever possible.
/// </summary>
public class XmlTextWriterEE : XmlTextWriter {

    public XmlTextWriterEE(TextWriter sink) : base(sink) {;}

    public override void WriteFullEndElement() {
        base.WriteEndElement();
    }

}
Pagina: 1