Avatar billede jokkejensen Novice
24. september 2008 - 11:29 Der er 3 kommentarer og
1 løsning

Lukke xhtml tags med attributter korrekt.

Hej.

Jeg har en .net frontend der kører noget xml op gennem noget xslt - msxml 4 formoder jeg.

Jeg har nogle <input> felter, jeg gerne vil berige med <xsl:attributes>..

Mit output bliver ligegyldt hvad <input type="text"></input>

Hvor jeg gerne ville have <input type="text" />.

Jeg bruger <input><xsl:attribute name="type">text</xsl:attribute>. Jeg har xsl:output sat til xml, og man kan jo sige det er welformed xml, men ikke validerende xhtml. Sætter jeg den til html er resultatet dog det samme.

Jeg kan ikke nøjes med <input type="{xslt}" /> da nogle af attributterne er afhængige af xml om de skal vises eller ej, jeg øsnker ikke tomme attributter i min markup.

Jeg vil helst ikke streng concatenere, da det giver noget lidt mere gennemskueligt xslt uden, og det tvinger ikke folk til at skrive gyldig xhtml i xslt'en.

Jeg har forsøgt med <xsl:element><xsl:attribute /></xsl:element> som giver det samme resultat.

Nogen der har et bud ?

Vh
Avatar billede arne_v Ekspert
24. september 2008 - 22:12 #1
Mystisk.

Jeg kan slet ikke genskabe problemet.

using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

namespace E
{
    public class MainClass
    {
        public static string Transform(string xml, string xsl)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(new XmlTextReader(new StringReader(xsl)), new XsltSettings(true, true), null);
            StringWriter sw = new StringWriter();
            XmlTextWriter wrt = new XmlTextWriter(sw);
            wrt.Formatting = Formatting.Indented;
            xslt.Transform(doc, wrt);
            return sw.ToString();
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(Transform("<dummy/>", "<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'><xsl:template match='/'><doc><elm><xsl:attribute name='foo'>bar</xsl:attribute></elm></doc></xsl:template></xsl:stylesheet>"));
            Console.WriteLine(Transform("<dummy/>", "<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'><xsl:output method='html'/><xsl:template match='/'><doc><elm><xsl:attribute name='foo'>bar</xsl:attribute></elm></doc></xsl:template></xsl:stylesheet>"));
            Console.ReadKey();
      }
    }
}

<doc>
  <elm foo="bar" />
</doc>
<doc>
  <elm foo="bar" />
</doc>
Avatar billede arne_v Ekspert
24. september 2008 - 22:13 #2
Hvis den .NET er 2.0+ saa er det MSXML6.

Ioevrigt er jeg ikke imponeret over at output html giver det den goer !
Avatar billede jokkejensen Novice
25. september 2008 - 14:19 #3
Takker, det var noget helt 3, men jeg kunne da få fundet fejlen ud fra dit eksemple.

Det skyldes jeg brugte xml:space="preserve" på <xsl:stylesheet /> (igen bare for at lave et pænt output)..

Efter jeg har fjernet den, virker det perfekt.

Smid et svar..  og tak for din tid !
Avatar billede arne_v Ekspert
27. september 2008 - 00:50 #4
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester