Avatar billede hrc Mester
09. november 2005 - 12:55 Der er 10 kommentarer og
1 løsning

Best practice til optionelle attributter

Jeg har et udpluk af docBook elementer som skal transformeres til xhtml.

Med de optionelle attributter skal jeg enten overføre attributterne til et elementet eller have det tomt, eksempelvis: <td colspan="2"> kontra <td>

Kan godt finde ud af at lave en xsl:when/xsl:otherwise ... men hvis jeg har en

<td>
  <xsl:for-each select="entry">
    ...
  </xsl:for-each>
</td>

så skal hele baduljen med både i when og otherwise.

<xsl:choise>
  <xsl:when test="..\..\@cols"> // (er required, jeg ved det)
    <td>
      <xsl:for-each select="entry">
        ...
      </xsl:for-each>
    </td>
  </xsl:when>
  <xsl:otherwise>
    <td colspan="3">
      <xsl:for-each select="entry">
        ...
      </xsl:for-each>
    </td>
  </xsl:otherwise>
</choise>

Har også prøvet at lave en variabel der enten er tom eller indeholder 'colspan="2"', men det kunne jeg ikke finde ud af at få proppet ind i <td>'en.

Den slags redundans kan ikke være korrekt og jeg efterlyser en pænere måde at løse det på.

pft. nooben
Avatar billede softspot Forsker
09. november 2005 - 13:15 #1
kan du ikke bare lave en named template som du kalder med call-template? Den arbejde på den aktuelle kontekst, så den burde du bare kunne kalde med de fornødne parametre...
Avatar billede atoft Nybegynder
09. november 2005 - 13:18 #2
Du kan bruge <xsl:attribute> det tilføjer en attribute til det element du i igang med at bygge - altså td

<td>
  <xsl:for-each select="entry">
    <xsl:attribute ...>
  </xsl:for-each>
</td>
Avatar billede hrc Mester
09. november 2005 - 13:59 #3
Simpelt og umiddelbart elegant. Jeg underskrev også spørgsmålet med "noob", som jeg antager betyder "nybegynder".

Helt let går det dog ikke:

Det her er åbenbart XSLT 2.0 for det virkede ikke:
  <xsl:attribute name="colspan" type="xsl:integer" select="../../@cols"/>

mens dette er XSLT 1.0:
  <xsl:attribute name="colspan">
    <xsl:value-of select="../../@cols"/>
  </xsl:attribute>

Hvis jeg fjerner attributten fra min xml-fil, så skriver den colspan="" som var hvad jeg gerne ville undgå.

Har så forsøgt at undersøge om attributten findes:

<!-- should be shown, it does -->
<xsl:if test='"../../@cols" != ""'>
  <xsl:attribute name="colspan">
    <xsl:value-of select="../../@cols"/>
  </xsl:attribute>
</xsl:if>

<!-- should NOT be shown, well it does -->
<xsl:if test='"../../@rows" != ""'>
  <xsl:attribute name="rowspan">
    <xsl:value-of select="../../@rows"/>
  </xsl:attribute>
</xsl:if>

Jeg validerer altså ikke korrekt på om den findes.
Avatar billede hrc Mester
09. november 2005 - 14:06 #4
Har også prøvet: <xsl:template match="../../tgroup[@cols]"> men så har jeg "nestede templates".
Avatar billede hrc Mester
09. november 2005 - 14:11 #5
Nå, det her virker, men kan jeg gøre det pænere?

<xsl:if test="../../../tgroup[@cols]">
(køres fra context /tgroup/tfoot/row og cols er i tgroup)
Avatar billede atoft Nybegynder
09. november 2005 - 14:18 #6
<xsl:if test='"../../@rows">

er nok til at spørge på om et element/attribute eksisterer
Avatar billede atoft Nybegynder
09. november 2005 - 14:19 #7
ja mit duer ikke kan jeg lige se
Avatar billede hrc Mester
09. november 2005 - 15:46 #8
Den laver en attribut til mig, det er halvvejen. Så føjede jeg selv en if'er på og så var de relativt pænt.

Det jeg har fået er hermed godt nok - nu kommer bare alt det andet jeg skal have lavet inden fredag...

Tak for hjælpen.
Avatar billede atoft Nybegynder
09. november 2005 - 20:35 #9
Det var så lidt. Ja jeg forudsatte at du havde styr på if-sætningen :-)

Om du kan gøre koden pænere med hensyn til din if test er svær at sige. Når man ikke har xml'en. Håber du når det til fredag :-)
Avatar billede hrc Mester
11. november 2005 - 09:25 #10
Havde håbet at der var en "skriv kun noget hvis der er noget"-funktion i XSLT. Synes det var ret åbenbart at lave funktionen sådan (men intet er logisk i XSLT!) og troede lige funktionen havde sneget sig ind i XSLT 2.0 hvor en xsl:attribute har attributten validation="strip"; hæftede mig ved ordet "strip", men det viste sig at være noget andet.

Kan jeg ikke friste med lidt points?
Avatar billede hrc Mester
11. november 2005 - 09:25 #11
Hva' dælen! Du har jo fået points. Beklager, men så får du ikke flere ;-)
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