Avatar billede nute Nybegynder
26. april 2010 - 22:22

XSL transformation med variabel med navn 'contentWidth' der skaber problemer

Hej

Jeg sidder med et xml dokument, der skal transformeres med XSL via PHP.

I min XSL har jeg en variabel med navn 'contentWidth'. Jeg kan desværre ikke ændre denne, da det er et kundesystem og det er en global variabel i en relativt kompleks XSL struktur. Variablens indhold hentes fra et andet XML dokument, end dét dokument der bliver transformeret. Dette bør der normalt ikke være nogle problemer med, men jeg oplever at under visse omstændigheder, så fejler hele min transformation.

Jeg har 4 grundlæggende variabler, defineret først i min XSL:

<xsl:variable name="range" select="document('range.xml')/range"/>
<xsl:variable name="layout" select="document('layout.xml')/layout"/>
   
<xsl:variable name="id"><xsl:value-of select="//@id"/></xsl:variable>
<xsl:variable name="contentType"><xsl:value-of select="$range/content[$id >= @min and $id <= @max]/@type"/></xsl:variable>

Disse variabler er der ingen problemer med, men min 'contentWidth' variabel, som defineres efterfølgende, er ret problematisk.

Hvis jeg definere min 'contentWidth' variabel på denne måde:

<xsl:variable name="contentWidth">contentWidth</xsl:variable>

så er der ingen problemer i min transformation (andet end at værdien er forkert)

Hvis jeg definere min 'contentWidth' variabel på denne måde:

<xsl:variable name="contentWidth"><xsl:value-of select="$id"/></xsl:variable>

så er der ingen problemer med min transformation (andet end at værdien er forkert)

MEN ... hvis jeg definere min 'contentWidth' variabel på denne måde:

<xsl:variable name="contentWidth"><xsl:value-of select="$layout/settings[@type = $contentType]/width[@type='content']"/></xsl:variable>

Så brager det hele sammen. Det sjove er, at jeg har en tilnærmet identisk variabel, som der IKKE er problemer omkring - denne er defineret således:

<xsl:variable name="globalWidth"><xsl:value-of select="$layout/settings[@type = $contentType]/width[@type='global']"/></xsl:variable>

Og for at gøre det endnu mere sjovt, så fungere min problematiske variabel, hvis jeg blot ændrer første bogstav til upper case: ContentWidth.

Jeg kan ikke gennemskue hvordan dette hænger sammen og håber på at få nogle andre øjne på.

Nedenfor er copy'n'paste enabled kode, som er simplificeret for at belyse problemet.

Min dokumentstruktur er:

test.php (script der foretager transformationen)
test.xsl (xsl der transformere min xml)
content.xml (xml filen der skal transformeres)
layout.xml (xml 'konfigurationsfil' der indeholder HTML layout parametre)
range.xml (en form for mapping dokument)

test.php
---------------
<?
# LOAD XML FILE
$XML = new DOMDocument();
$XML->load( 'content.xml' );

# START XSLT
$XSLT = new XSLTProcessor();

# IMPORT STYLESHEET
$XSL = new DOMDocument();
$XSL->load( 'test.xsl' );
$XSLT->importStylesheet( $XSL );

echo $XSLT->transformToXML( $XML );

?>
------------------------
test.xml
------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>
   
    <!-- DOCUMENT VARIABLES -->
    <xsl:variable name="range" select="document('range.xml')/range"/>
    <xsl:variable name="layout" select="document('layout.xml')/layout"/>
   
    <!-- GLOBAL VARIABLES -->
      <xsl:variable name="id"><xsl:value-of select="//@id"/></xsl:variable>
    <xsl:variable name="contentType"><xsl:value-of select="$range/content[$id >= @min and $id <= @max]/@type"/></xsl:variable>
   
    <xsl:variable name="globalWidth"><xsl:value-of select="$layout/settings[@type = $contentType]/width[@type='global']"/></xsl:variable>
    <xsl:variable name="language">en</xsl:variable>

    <!-- 1) Denne virker -->
    <xsl:variable name="contentWidth">contentWidth</xsl:variable>
    <!-- 2) Denne virker -->
    <!-- <xsl:variable name="contentWidth"><xsl:value-of select="$id"/></xsl:variable> -->   
    <!-- 3) Denne virker ikke -->
    <!-- <xsl:variable name="contentWidth"><xsl:value-of select="$layout/settings[@type = $contentType]/width[@type='content']"/></xsl:variable>  -->
    <!-- 4) Denne virker  -->
    <!-- <xsl:variable name="ContentWidth"><xsl:value-of select="$layout/settings[@type = $contentType]/width[@type='content']"/></xsl:variable>-->
   
    <!-- TEMPLATES -->
    <xsl:template match="/">
    id: <xsl:value-of select="$id"/><br/>
    language: <xsl:value-of select="$language"/><br/>
    contentType: <xsl:value-of select="$contentType"/><br/>
    globalWidth: <xsl:value-of select="$globalWidth"/><br/>
    contentWidth: <xsl:value-of select="$contentWidth"/><br/>
    </xsl:template>
   
</xsl:stylesheet>

------------------------
content.xml
------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<article id="100002450">
  <metadata>
    <locale>
        <language>en</language>
    </locale>
  </metadata>
</article>

------------------------
layout.xml
------------------------
<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <settings type="article">
        <width type="global">991</width>
        <width type="menu">172</width>
        <width type="main"></width>
        <width type="content">453</width>
        <width type="plugin">303</width>
        <width type="spacer"></width>
    </settings>
    <settings type="medicine">
        <width type="global">1000</width>
        <width type="menu">140</width>
        <width type="main">680</width>
        <width type="content">470</width>
        <width type="plugin">200</width>
        <width type="spacer">10</width>
    </settings>
</layout>

------------------------
range.xml
------------------------
<?xml version="1.0" encoding="UTF-8"?>
<range>
    <content type="article" min="000000" max="599999"/>
    <content type="medicine" min="100000000" max="200000000"/>
</range>

Er der nogen der har et bud på, hvorfor min 'contentWidth' variabel driller?

Jeg kører på en apache server - fra phpinfo: Apache/2.2.9 (Unix) PHP/5.2.13
/nute
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

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