Avatar billede wise Seniormester
20. oktober 2011 - 00:01 Der er 7 kommentarer og
1 løsning

Select i Xpath, ignorere case

Hej alle i kloge mennesker.

Jeg er ret urutineret i c#, men kender til en del programmeringsprog samt xml og Xpath.
I noget c# kode skal jeg udvælge en XML node via XPATH (Derfor er min spr under XSLT)

Jeg bruger en værdi fra en liste til at slå op i en anden, men de er ikke ens i forhold til store-små bogstaver.

2 Eksempler, den første er jo ens i case på modulname, den anden er ikke!
--------------------------------------------------------
<Frame FrameNumber="1" ReturnAddress="0x26382db3" ModuleName="D:\Keybalance\ipworks6.dll" FunctionName="XMLp_StaticDestroy" FunctionDisplacement="0xab37" />
---->
<Module FullPath="D:\Keybalance\ipworks6.dll" BaseAddress="0x26340000" Size="0x0009b000" TimeStamp="01/05/2007 08:56:24" FileVersion="6.1.2561.0" ProductVersion="6.1.2561.0" />

<Frame FrameNumber="5" ReturnAddress="0x10aac4b" ModuleName="D:\Keybalance\modules\VAM.dll" FunctionName="iModule::`vbase destructor'" FunctionDisplacement="0x1f8b" />
----->
  <Module FullPath="D:\Keybalance\modules\vam.dll" BaseAddress="0x010a0000" Size="0x00124000" TimeStamp="08/30/2011 16:47:13" FileVersion="0.0.0.0" ProductVersion="0.0.0.0" />
--------------------------------------------------------

Jeg slår dem op med denne kode
_ModRec = _xmlDoc.SelectSingleNode("/Exception/Modules/Module[@FullPath='" + ModuleName + "']");

Er der nogen måde jeg kan lave den select ([...]) til at ignorere alle caseændringer? Jeg har overvejet om jeg kan tvinge dem til upper eller lower, men kan jeg i givet fald også det inden i den kode???
Avatar billede jokkejensen Novice
20. oktober 2011 - 08:25 #1
<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />


<xsl:template match="/">
  <xsl:value-of select="translate("DennE TKst Er LowerCasE", $smallcase, $uppercase)" />
</xsl:template>


Så din bliver noget ala:

_ModRec = _xmlDoc.SelectSingleNode("/Exception/Modules/Module[translate(@FullPath, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" + ModuleName.ToLower() + "']");
Avatar billede jokkejensen Novice
20. oktober 2011 - 08:28 #2
jeg ved ikke om C# understøtter xpath 2.0, men i givet fald:

_ModRec = _xmlDoc.SelectSingleNode("/Exception/Modules/Module[lower-case(@FullPath)='" + ModuleName.ToLower() + "']");
Avatar billede arne_v Ekspert
20. oktober 2011 - 12:40 #3
Nej. Kun 1.0.

Men der findes 3. parts libs med 2.0 support.
Avatar billede jokkejensen Novice
20. oktober 2011 - 15:16 #4
@Arne > Aner du noget om hvornår ? de er jo knapt færdige med specifikationen på w3c - hvorfor tager sådanne så længe at rulle ud :/ http://www.w3.org/TR/xpath20/

/J
Avatar billede arne_v Ekspert
20. oktober 2011 - 16:49 #5
Det er mit indtryk at det vil kunne tage meget lang tid. Af mig ubegribelige grunde er XPath 2.0 ikke noget der prioriteres ret hoejt generelt.
Avatar billede wise Seniormester
20. oktober 2011 - 22:48 #6
@Jokke

Perfekt det var lige det med translate.
Dog valgte jeg at sammenligne den med ModuleName.ToUpper() frem for ModuleName.ToLower() i dit eksempel ;-)

Jeg var godt faldet over translate i min søgning, men troede den skulle laves i en variabel eller template match.

Hvis du vil have de velfortjente points, så smid lige et svar ellers lukker jeg den en af dagene...
Avatar billede jokkejensen Novice
21. oktober 2011 - 10:25 #7
takker, special tegn skal ofte escapes, ex &amp;

/J
Avatar billede jokkejensen Novice
21. oktober 2011 - 10:25 #8
svar
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