2010-11-25 5 views
1

J'ai un tas de fichiers docbook qui ont des attributs variables sur leurs imagedata. Je veux avoir tous ont 1 attribut unique, et 3 attributs identiques:Attribut XSL Spécifique conforme

<section xmlns="http://docbook.org/ns/docbook" version="5" xml:id="cancelDia"> 
    <title>Screenshot</title> 
    <mediaobject> 
     <imageobject> 
     <imagedata fileref="screenshots/cancelDialog.png" scalefit="1" width="100%" contentdepth="100%"/> 
     </imageobject> 
    </mediaobject> 
    </section> 

Le fileref est unique et doit être laissé seul, mais scalefit, la largeur et contentdepth doivent être les mêmes entre tous <imagedata>. Un problème est que la plupart des données d'image ont une échelle, quelques-unes ont une largeur, et la plus rare a une profondeur de contenu. Comment puis-je m'assurer, même s'ils ont déjà cet attribut, tous mes <imagedata> ont les mêmes scalefit, width et contentdepth?

Note: Je ne sais pas si cette question est importante, mais je suis en utilisant DocBook 5

+0

Bonne question, +1. Voir ma réponse pour une solution presque identique à celle de @Alejandro, qui ajuste juste le problème d'espace de noms par défaut et utilise l'approche paramétrée. –

Répondre

4

Cette feuille de style:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:doc="http://docbook.org/ns/docbook" 
xmlns="http://docbook.org/ns/docbook" 
exclude-result-prefixes="doc"> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="doc:imagedata"> 
     <imagedata fileref="{@fileref}" 
         scalefit="1" width="100%" contentdepth="100%"/> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<section version="5" xml:id="cancelDia" xmlns="http://docbook.org/ns/docbook"> 
    <title>Screenshot</title> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="screenshots/cancelDialog.png" 
         scalefit="1" width="100%" contentdepth="100%" /> 
     </imageobject> 
    </mediaobject> 
</section> 

Modifier: Matching nouvel échantillon d'entrée.

+0

@Alejandro: Oui cela fonctionne pour ma question initiale, bien que je n'arrive pas à l'obtenir l'espace de noms docbook. J'ai mis à jour ma question pour qu'elle soit plus proche de ce que je regarde. – Ace

+0

Vous devrez peut-être déclarer l'espace de noms docbook 'xmlns: docbook =" http://docbook.org/ns/docbook "' dans le fichier XSLT et ajuster le docbook '@ match =": imagedata "' –

+0

J'ai essayé cela , et malheureusement il jette aussi: xmlns = "" xmlns: d = "http://docbook.org/ns/docbook" dans le pour une raison quelconque – Ace

1

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:d="http://docbook.org/ns/docbook" 
xmlns="http://docbook.org/ns/docbook" 
xmlns:ext="http://exslt.org/common" 
exclude-result-prefixes="d ext"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pAttribs"> 
    <p scalefit="1" width="100%" contentdepth="100%"/> 
</xsl:param> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="d:imagedata"> 
    <xsl:copy> 
    <xsl:copy-of select="@fileref 
    | 
    ext:node-set($pAttribs)/*/@*"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni:

<section xmlns="http://docbook.org/ns/docbook" 
     version="5" xml:id="cancelDia"> 
    <title>Screenshot</title> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="screenshots/cancelDialog.png" 
      scalefit="1" 
      width="100%" 
      contentdepth="100%"/> 
     </imageobject> 
    </mediaobject> 
</section> 

produit le résultat souhaité, correct:

<section xmlns="http://docbook.org/ns/docbook" 
     version="5" xml:id="cancelDia"> 
    <title>Screenshot</title> 
    <mediaobject> 
     <imageobject> 
     <imagedata fileref="screenshots/cancelDialog.png" 
        scalefit="1" width="100%" contentdepth="100%"/> 
     </imageobject> 
    </mediaobject> 
</section> 

Prenez note:

Toutes les valeurs souhaitées sont définies comme attributs d'un élément à l'intérieur d'un <xsl:param> externe

+0

Pourquoi le tag imagedata change-t-il et y ajoute également des xmlns? Y a-t-il un moyen d'empêcher cela? * EDIT * semble que vous avez juste besoin de faire docbook l'espace de noms deault? Bonne réponse aussi bien. – Ace

+0

@Ace: Bonne observation. Voyez non seulement cette solution mais une nouvelle technique de paramétrage. :) –

Questions connexes