19. september 2005 - 00:03
Der er
23 kommentarer og 2 løsninger
Upper-case?
Hej
Jeg har et problem med at få upper-case xpath funktionen til at virke...
Jeg har tilføjet følgende i toppen af filen:
xmlns:xpath="
http://www.w3.org/2005/02/xpath-functions" - men det fejler hvis jeg fx. kører
<a href="#" title="{xpath:upper-case(@nodeName)}"></a>
Bevares - jeg er ikke nogen xslt haj, men jeg synes, ovenstående bør virke...?
- Andreas
Annonceindlæg fra QNAP
19. september 2005 - 08:28
#1
kan du ikke bruge en translate(@nodeName,'abcde....','ABCDE.....')?
19. september 2005 - 08:41
#2
hmm. tjo, men det er lidt uhensigtsmæssigt... det er et menuoutput fra et cms... hvis jeg skulle gøre det, så ville min fil blive uhensigtmæssigt stor - og når der nu er en funktion, jeg kan bruge direkte... :o) - Andreas
19. september 2005 - 08:43
#3
hvad er xslt
19. september 2005 - 08:51
#4
xml stylesheets... bruges til at formatere xml filer :o)
19. september 2005 - 09:00
#5
Tjek evt.
www.w3schools.com og kig deres artikler og tutorials igennem. De giver en god intro til xml, xsl og xpath.
Nå... nogen, der kan svare på mit spm?
19. september 2005 - 10:30
#6
Jeg spekulerede på om du kunne klare det med noget inline script, men jeg er ikke helt klar over hvilken platform du kører på og om msxsl:script er en gangbar løsning.
Hvis det er kan du måske komme videre således:
<xsl:stylesheet version="1.0"
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts">
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function uppercase(r)
{
return r.toUpperCase();
}
]]>
</msxsl:script>
<xsl:template match="*">
<xsl:value-of select="user:uppercase(.)"/></p>
</xsl:template>
</xsl:stylesheet>
19. september 2005 - 11:20
#7
jeg kan godt bruge scripts... men jeg skal vel bruge et namespace at linke til - my-scripts har jeg som sagt ikke :) - men ja, det undrer mig stadigvæk, jeg ikke bare kan linke direkte til xpath og bruge dens funktioner - det ville være væsentlig mere interessant...
19. september 2005 - 11:24
#8
Kan du få ovenstående til at fungere? xmlns:user er vel bare en sikkerhed for at funktionen ikke bliver mixet sammen med andre, du kunne i princippet kalde den moster-oda (eller master-yoda) for den sags skyld...
19. september 2005 - 11:37
#9
det fejler, når jeg inkluderer <msxsl:script language="JScript" implements-prefix="user"> <![CDATA[ function uppercase(r) { return r.toUpperCase(); } ]]> </msxsl:script>
19. september 2005 - 11:48
#10
Prøv med denne modificerede version (med ekspliciit konvertering af node til string i kaldet til funktionen):
<xsl:stylesheet version="1.0"
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts">
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function uppercase(r)
{
return r.toUpperCase();
}
]]>
</msxsl:script>
<xsl:template match="*">
<xsl:value-of select="user:uppercase(string(.))"/></p>
</xsl:template>
</xsl:stylesheet>
19. september 2005 - 20:17
#11
ja translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ') fylder ganske vist lidt mere, men jeg synes det er en pris som er værd at betale for at have et w3 compliant stylesheet, som kan afvikles af alle xslt-processorer.
19. september 2005 - 20:35
#12
Ja, hvis det er den fleksibilitet man har behov for :)
19. september 2005 - 21:37
#13
jo jo men jeg synes nu ikke <msxsl:script language="JScript" implements-prefix="user"> <![CDATA[ function uppercase(r) { return r.toUpperCase(); } ]]> </msxsl:script> fylder mindre ;-)
19. september 2005 - 21:41
#14
Kommer jo an på hvor ofte du skal bruge den...
19. september 2005 - 21:44
#15
Betragt flg. kode: <xsl:value-of select="user:uppercase(string(.))"/> <xsl:value-of select="user:uppercase(string(.))"/> <xsl:value-of select="user:uppercase(string(.))"/> <xsl:value-of select="user:uppercase(string(.))"/> <xsl:value-of select="user:uppercase(string(.))"/> <xsl:value-of select="user:uppercase(string(.))"/> og flg. kode: <xsl:value-of select="translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')" /> <xsl:value-of select="translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')" /> <xsl:value-of select="translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')" /> <xsl:value-of select="translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')" /> <xsl:value-of select="translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')" /> <xsl:value-of select="translate(@nodeName,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')" /> og fortæl mig hvilken en af de to du synes 1. er lettest at overskue 2. er lettest at skrive :)
19. september 2005 - 21:45
#16
Nej for man laver jo en template som du også gør. Så i stedet for. <xsl:template match="*"> <xsl:value-of select="user:uppercase(string(.))"/></p> </xsl:template> bliver det jo bare <xsl:template match="*"> <xsl:value-of select="translate(@.,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')"/> </xsl:template>
19. september 2005 - 22:17
#17
Men du skal vel stadig angive en parameter til kaldet (som jeg i øvrigt ville lave til en named template). Således: <xsl:template name="upper-case"> <xsl:param name="item" select="." /> <xsl:value-of select="translate($item,'abcdefghijklmnopqrstuvwyzxæøå','ABCDEFGHIJKLMNOPQRSTUVWYZXÆØÅ')"/> </xsl:template> i bedste fald skal den kaldes således: <xsl:call-template name="upper-case" /> men hvis jeg ønsker at ændre det element jeg vil konvertere, så skal jeg til at kalde den således: <xsl:call-template name="upper-case"> <xsl:with-param name="item" select="../test" /> </xsl:call-template> hvilket jo snart bliver endnu værre end bare at skrive translate direkte... Jeg synes stadig scriptversionen er mere fleksibel.
19. september 2005 - 22:34
#18
Jeg er enig i at script version er mere enkel og kan bruges i forbindelse med {} her vil mit template forslag kræve at man laver <xsl:attribute>. Men om den er mere fleksibel kommer vel an på hvorledes man definerer fleksibel. Er det fleksibel at lave et stylesheet som kun kan anvendes i forbildelse med MSXML? I øvrigt kunne man lave en xsl:template med mode attribute i stedet for xsl:call-template, så vil parametre overførslen ikke være som komples.
19. september 2005 - 22:42
#19
Fair nok. Principielt kan vi godt blive enige om at det er bedre at binde sig så lidt som muligt til en bestemt platform, men på den anden side, må man også overveje hvor meget man vil ofre på den konto frem for andre egenskaber, hvis man ved det er en MSXML det kommer til at køre på... Jeg tror jeg vil trækker mig ud af denne diskussion, om ikke andet indtil mailand melder sig på banen... :)
19. september 2005 - 22:46
#20
Ja man må sige han har fået noget fordi 30 points :-)
19. september 2005 - 23:32
#21
hehe. mange tak for jeres svar... jeg er endt med at bruge translate, men kan i ikke smide et nyt svar hver, så deler jeg point... - Andreas
19. september 2005 - 23:36
#22
Jo, det får du da lige her :)
20. september 2005 - 08:21
#23
Jo da og mellem os. Så har du valgt den rigtige løsninge ;-)
20. september 2005 - 09:06
#24
hehe - jeg takker for hjælpen :-)
20. september 2005 - 10:39
#25
Tak for point :)
Kurser inden for grundlæggende programmering