Toon posts:

[XML&XSL] Hyperlinks relatief aan XML bronbestand

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben niet echt goed in samenvatten, laat staan van onderwerpen/kwesties die ik zelf nog niet helemaal bevat, dus mijn excuses voor de lange en potentieel erg onduidelijke post:

Ik heb een poosje geleden de vraag gesteld of het mogelijk is om een statische html web site te genereren vanuit XML bronbestanden. Het antwoord was positief, en sindsdien ben ik bezig om mijn bestaande web site (http://members.home.nl/xolox) om te zetten in XML. Ongeveer de helft van de HTML bestanden is nu omgezet in XML, en ik heb twee XSL stylesheets, een voor alle pagina's en een voor mijn web log. Alles oke tot nu toe, ben erg blij met de combinatie van Ant en XML & XSL, maar ik heb 1 probleem nog steeds niet op kunnen lossen.

Ik gebruikte tot nu toe altijd relatieve links voor mijn hele web site. Op deze manier werkt alles zowel lokaal als online. Mocht ik mijn bestanden ergens anders uploaden, dan werkt alles dus ook gewoon. Ideaal, maar ik heb geen idee hoe ik deze opzet kan behouden in XML.

Toen ik mijn bestanden omzette in XML liet ik eerst de hardcoded links (ala about_me/contact.html) even staan, zodat ik meteen kon zien of alles een beetje functioneerde. En dat deed het gelukkig ook.

Heel erg leuk, maar als ik als bron voor mijn web site XML gebruik, wil ik natuurlijk wel gebruik maken van de voordelen van XML, en niet alsnog vastzitten aan van die hardcoded html links.

Ik hoop/neem aan dat jullie snappen wat ik bedoel?

Als ik de links in mijn XML bestanden laat verwijzen naar de nog te maken html-bestanden, is dat natuurlijk nogal belachelijk, en het doet ook het concept van XML als bron teniet...

Hoe kan ik in mijn XML bestanden document relatieve links maken, die door mijn XSL stylesheet gecorrigeerd worden tot werkende links voor de html versie van mijn web site?

En nog iets: Ant verwerkt in 1 keer mijn hele verzameling XML bestanden met hetzelfde XSL stylesheet, en pleurt ze volgens de originele directory-layout onder mijn output directory. Maar als ik nu bijvoorbeeld een navigatie menu in mijn XSL stylesheet toevoeg, hoe kan ik er dan voor zorgen dat deze links vanuit alle directory's werken (eg. gecorrigeerd worden tot relatieve links)?

Bij voorbaat mijn dank!

Peter Odding



PS. Ik heb XML Base al eens bekeken, maar dit leek me niet de oplossing, omdat ik het niet kan gebruiken om document relatieve links te maken, maar site relatieve links...

PS2. Ik heb al een paar dagen op internet gezocht naar oplossingen voor dit probleem, maar heb geen duidelijke informatie kunnen vinden. Ik heb bijvoorbeeld wel een XSL library gevonden, met functies als util:getRelativeUri, maar dan zou ik voor elk XML bestand dat verwerkt wordt, een parameter met het absolute pad naar het bestand mee moeten kunnen geven, en ik heb geen idee hoe ik dit in Ant zou moeten doen.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik snap er helemaal niets van eerlijk gezegd :P

Als je nou eens uitlegt over wat voor relatieve links je het hebt. Mischien een voorbeeldje van hoe je het nu hebt en hoe je het graaf zou willen hebben. Het is erg moeilijk voor ons om voor te stellen wat je nou bedoeld zonder een voorbeeldje. Ik denk dat je dan wat meer reacties krijgt. Een klein stukje code zegt meer dan duizend woorden (of niet, maar het helpt wel).

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Denk niet dat code veel zin heeft want het is gewoon XML in mijn eigen dialectje, dus bijvoorbeeld <reference url="../index.html"> wat ik met een XSL stylesheet omzet tot HTML, en hopelijk binnenkort ook PDF, en eventueel RTF. Onderaan staat wel mijn huidige XSL template voor hyperlinks. Dit template moet dus de links corrigeren.

Ik gebruik Ant om (o.a) mijn directory tree gevuld met XML bestanden om te zetten in een identieke directory tree in de output map, met de XML bestanden verwerkt tot HTML bestanden met een XSL stylesheet. Het probleem simpel gezegd: hoe moet ik links tussen de bestanden maken?.

Ant verwerkt op deze manier mijn XML bestanden:
code:
1
2
3
4
5
<target name="Convert XML to HTML" depends="Transform and copy images">
  <echo>Processing web site's files...</echo>
  <xslt basedir="${dir_input_xml}" destdir="${dir_output}" extension=".html" style="${stylesheet_default}" includes="**/*.xml"/>
  <echo>Done</echo>
</target>

En hier zijn de variabelen die de mappen aanduiden:
code:
1
2
3
<property name="stylesheet_default" location="input/xsl/default.xsl"/>
<property name="dir_input_xml" location="input/xml" />
<property name="dir_output" location="output" />

Ik wil eigenlijk niet linken op deze manier: <a href="../about_me/contact.html">...</a>, dus in mijn XML bestanden al de .html extensie gebruiken voor links. Het werkt wel, maar het idee van mijn XML bestanden als bron voor mijn web site is juist dat ik niet afhankelijk ben van de vorm waarin ik mijn web site "exporteer". Dat is dus op dit moment in HTML, met behulp van een XSL stylesheet. Maar ik wil ook kunnen exporteren naar .PDF, of voor mijn part .DOC. Het punt is dat XML een algemeen formaat is om mijn web site's inhoud te bewaren. Maar als ik de links als hierboven maak, zit ik wel vast aan de HTML versie van mijn web site.

Ik weet ondertussen al hoe ik onderscheid maak tussen een link met "http" aan het begin, of zonder, dus een interne link.

Maar ik weet niet hoe ik bijvoorbeeld de extensie .XML in een link in een van mijn XML bestanden kan veranderen tot .HTML. Het is vast heel simpel, maar als ik dat doe kan ik niet meer linken naar een XML bestand, wat ik wel van plan was. Dan wordt die extensie ook omgezet tot .HTML. Dan zou ik hier een workaround voor moeten maken, door bijvoorbeeld een extra attribute van de link tag te controleren.

Ik denk: Er moet een logische oplossing zijn hiervoor, maar ik vind op internet werkelijk niks nuttigs over dit probleem.

En het tweede probleem: Als ik via mijn XSL stylesheet een navigatie balk wil plaatsen op elke pagina, hoe kunnen de links dan intact blijven onder welke map dan ook, doormiddel van relatieve links, dus "../about_me/contact.html" of "../../../about_me/contact.html" in plaats van "http://members.home.nl/xolox/about_me/contact.html" of "/about_me/contact.html".

Hehe, volgens mij heb ik het nog onduidelijker gemaakt door mijn tweede poging, maargoed, ik hoor het wel ;). Alvast bedankt voor de moeite.

-XoloX

Mijn huidige XSL template voor hyperlinks. Dit template moet dus de links corrigeren.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- Hyperlinks -->
<xsl:template match="webpage/content//reference">
    <xsl:choose>
        <xsl:when test="@url">
            <xsl:choose>
                <xsl:when test="starts-with(@url, 'http')">
                    <b><a href="{@url}"><xsl:apply-templates/></a></b>
                </xsl:when>
                <xsl:otherwise>
                    <a href="{@url}"><xsl:apply-templates/></a>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
            <a name="{@id}" id="{@id}"><xsl:apply-templates/></a>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

[ Voor 40% gewijzigd door Verwijderd op 06-01-2005 23:03 . Reden: Ik blijf ook bezig ;-) ]


Verwijderd

"Maar ik weet niet hoe ik bijvoorbeeld de extensie .XML in een link in een van mijn XML bestanden kan veranderen tot .HTML"

Ha, daarvoor is er de functie 'translate'.
(te vinden in de spec, iets voorbij de substring functie die je zelf al gevonden had)

Wat betreft je link vraag: daarvoor is er de XLink standaard (van de makers van de XML standaard), da's het goede nieuws; het slechte nieuws is, dat niets of niemand die al ondersteund/geimplementeerd heeft ergens in, nou ja, in Mozilla een klein beetje.

Maar in bijvoorbeeld Internet Explorer is geen enkele poging gedaan de XLink standaard ook maar enigzins te ondersteunen.

Helaas.

Verwijderd

Topicstarter
Ik ben vannacht lang doorgegaan om een oplossing te vinden, maar heb natuurlijk nog geen concrete oplossing gevonden. Wel een paar dingen om rekening mee te houden. Ik heb tot nu toe nog maar twee XSL stylesheets gevonden die relatieve links ondersteunen / transformen. De eerste is DocBook / Website, een subset van DocBook, met aangepaste XSL stylesheets voor een web site. De tweede is te vinden op deze web site: http://www.helsinki.fi/jarj/papintappajat/making_of.html . Maar beide gebruiken ze een XML bestand dat de structuur van de web site illustreert. Ik gok er zo op dat het voor mij onmogelijk wordt om het niet volgens deze methode te doen.

Maar dan komt nog het tweede probleem. Ten eerste had ik constant problemen met DocBook / website. En toen dat toch al het geval was, dacht ik dat het wel interessant en leerzaam zou zijn om het probleem zelf op te lossen.

Hehe. Totdat ik de bron van sommige van die XSL stylehsheets zag. Dat zijn gewoon zonder grappen minstens 20 named templates die elkaar en zichzelf aanroepen!

Kortgezegd: Mijn probleem is wel op te lossen, maar simpel wordt het niet...

Ik heb ook nog eens de XML Base recommendation doorgelezen, maar het lost mijn probleem niet op, net zo min als X-Link. Ik moet nog altijd zelf een structuur voor mijn web site ontwerpen in een XML bestand, zodat links gecorrigeerd kunnen worden tot bijvoorbeeld ../../../../../about_me/contact.html in plaats van about_me/contact.html, via mijn XSL stylesheet. En ik heb de geavanceerdere functies van X-Link voor nu nog niet nodig, dus is X-Link wat mij betreft overbodig. PS. Mijn XSL stylesheet vertaald die links dus naar standaard <a href=""></a> links, dat had je toch wel door? Wat maakt het dan uit welke browsers X-Link ondersteunen?

EDIT: translate is toch voor individuele karakters, ipv strings als ".xml"?

[ Voor 27% gewijzigd door Verwijderd op 07-01-2005 16:10 ]