Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XSLT] Node verplaatsen in de output

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb de volgende mathml:
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<math xmlns="http://www.w3.org/1998/Math/MathML">
    <mn>4</mn>
    <msup>
        <mi>x</mi>
    </msup>
</math>

Die moet gecorrigeerd worden, want zo is ie niet valid. Ik wil een XSLT eroverheen gooien om dit eruit te krijgen:
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<math xmlns="http://www.w3.org/1998/Math/MathML">
    <msup>
        <mn>4</mn>
        <mi>x</mi>
    </msup>
</math>

Ik dacht aan iedere <msup> een een kopie van z'n vorige sibling te geven, en dan z'n vorige sibling weg te gooien. Dat eerste deel lukt perfect, en wel hiermee:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns="http://www.w3.org/1998/Math/MathML">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" exclude-result-prefixes="m"/>
    
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="m:msup">
        <msup>
            <xsl:copy-of select="preceding-sibling::*[1]"/>
            <xsl:apply-templates/>
        </msup>
    </xsl:template>
    
    <xsl:template match="m:msup/preceding-sibling::*[1]">
        <deleted/>
    </xsl:template>
</xsl:stylesheet>

Maar het tweede deel doet ie niet. die laatste template in bovenstaande XSLT matcht gewoon niet. Terwijl ik kan bewijzen met een simpele value-of dat die expressie wel degelijk hoort te matchen.

Op google wordt ik niet veel wijzer. Daar staat dat dit de manier is om een node weg te halen in de output, en dat werkt prima als de match-expressie alleen bijv "m:mi" is, maar iets complexers als dit matcht opeens niet.

Ik hoop dat mijn eerste gedachte "dat weet alleen God" niet klopt en iemand hier weet wat hier gaande is? Of weet iemand misschien een betere manier (met XSLT) om die <mn> verplaatst te krijgen?

日本!🎌


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Woom gebruik je niet
XML:
1
2
3
4
5
6
7
<xsl:template match="/">
<math>
    <msup>
        <mn><xsl:value-of select="//mn" /></mn>
        <mi><xsl:value-of select="//mi" /></mi>
    </msup>
</math>

If it isn't broken, fix it until it is..


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Ten eerste omdat ik niet weet waar de <msup> node staat, en ten tweede omdat ik niet weet wat het eerste element ervan is. Het is MathML he, daarin is heel veel mogelijk ;)

日本!🎌


  • foliant
  • Registratie: Juli 2007
  • Laatst online: 19-01-2022
Ik heb niet zo veel ervaring met MathML en ik weet ook niet hoe de rest van je MathML eruit ziet. Is het altijd een mn voor de msup?
Misschien werkt het als je je laatste template vervangt door de volgende:

XML:
1
2
3
4
5
6
7
8
9
<xsl:template match="m:mn">
<xsl:choose>
<xsl:when test="name(following-sibling::*[1])='msup'">
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>



Als er een select aantal andere elementen zijn die foutief voor de msup kunnen staan, kun je natuurlijk evenzoveel analoge templates maken.