2010-11-19 18 views
1

Je veux enlever précédente « ./ » et premier dossier si elle n'est pas nommé « captures d'écran » pour tout fileref qui appartient à imageDataXSL: la suppression des dossiers précédents sur imageobject fileref

donc de

<section xmlns="http://docbook.org/ns/docbook" version="5"> 
    <title>Screenshot</title> 

    <para xreflabel="New Type" xml:id="manageNewType"> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="./views/screenshots/manageType1.png" width="100%"/> 
     </imageobject> 
     <caption> 
      <para>New Mode</para> 
     </caption> 
    </mediaobject> 
    </para> 

    <para xreflabel="Edit Type" xml:id="manageEditType"> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="./screenshots/manageType2.png" width="100%"/> 
     </imageobject> 
     <caption> 
      <para>Edit Mode</para> 
     </caption> 
    </mediaobject> 
    </para> 
</section> 

Pour: Screenshot

<para xreflabel="New Type" xml:id="manageNewType"> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="screenshots/manageType1.png" width="100%"/> 
     </imageobject> 
     <caption> 
      <para>New Mode</para> 
     </caption> 
    </mediaobject> 
    </para> 

    <para xreflabel="Edit Type" xml:id="manageEditType"> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="screenshots/manageType2.png" width="100%"/> 
     </imageobject> 
     <caption> 
      <para>Edit Mode</para> 
     </caption> 
    </mediaobject> 
    </para> 
</section> 

Voici mon stylesheet courant ne semble pas être rien faire pour une raison quelconque ...

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

    <xsl:template match="imagedata/@fileref[starts-with(.,'./') 
    and not(starts-with(.,'./screenshots/')) 
    ]"> 
    <xsl:attribute name="fileref"> 
     <xsl:value-of select="substring-after(substring-after(.,'./'), '/')"/> 
    </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="imagedata/@fileref[starts-with(.,'./screenshots/')]"> 
    <xsl:attribute name="fileref"> 
     <xsl:value-of select="substring-after(.,'./')"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

Modifier Ajout xmlns = "http://docbook.org/ns/docbook" version = "5" à l'article.

+0

Bonne question. +1 Probablement votre document XML a changé depuis votre dernière question. Voir ma réponse pour une solution complète et simple. –

+0

Je ne peux pas reproduire ce problème. –

+0

@Alejandro: Vous avez raison, je viens de remarquer que j'ai raté le ns de la section. J'ai édité ma question en conséquence. – Ace

Répondre

1

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:d="http://docbook.org/ns/docbook"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

    <xsl:template match= 
    "d:imagedata/@fileref 
       [contains(., '/screenshots/') 
       and 
       not(starts-with(., 'screenshots/')) 
       ]"> 
    <xsl:attribute name="fileref"> 
     <xsl:value-of select= 
     "concat('screenshots/', substring-after(., '/screenshots/'))"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'elle est effectuée sur le document XML fourni:

<section xmlns="http://docbook.org/ns/docbook" version="5"> 
    <title>Screenshot</title> 

    <para xreflabel="New Type" xml:id="manageNewType"> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="./views/screenshots/manageType1.png" width="100%"/> 
     </imageobject> 
     <caption> 
      <para>New Mode</para> 
     </caption> 
    </mediaobject> 
    </para> 

    <para xreflabel="Edit Type" xml:id="manageEditType"> 
    <mediaobject> 
     <imageobject> 
      <imagedata fileref="./screenshots/manageType2.png" width="100%"/> 
     </imageobject> 
     <caption> 
      <para>Edit Mode</para> 
     </caption> 
    </mediaobject> 
    </para> 
</section> 

produit le résultat souhaité, correct:

<section xmlns="http://docbook.org/ns/docbook" version="5"> 
    <title>Screenshot</title> 
    <para xreflabel="New Type" xml:id="manageNewType"> 
     <mediaobject> 
      <imageobject> 
       <imagedata fileref="screenshots/manageType1.png" width="100%"/> 
      </imageobject> 
      <caption> 
       <para>New Mode</para> 
      </caption> 
     </mediaobject> 
    </para> 
    <para xreflabel="Edit Type" xml:id="manageEditType"> 
     <mediaobject> 
      <imageobject> 
       <imagedata fileref="screenshots/manageType2.png" width="100%"/> 
      </imageobject> 
      <caption> 
       <para>Edit Mode</para> 
      </caption> 
     </mediaobject> 
    </para> 
</section> 
+0

@Dimitre: C'est la même chose que ma réponse originale: 'substring-after (., Substring-before (., '/ Screenshots /'))' pour chaque 'imagedata/@ fileref'. Mais cela ne répond pas à ce besoin spécifique: * Je veux supprimer le précédent './' et le premier dossier s'il n'est pas nommé 'screenshots' *. Peut-être que si le requeriment est clarifié ... –

+0

@Alejandro: Tout à fait raison. C'est une exigence que j'ajoute maintenant. La chose étrange est que je vois que ces solutions devraient fonctionner, mais littéralement rien ne se passe. – Ace

+0

@Dimitre La solution ci-dessus fonctionne lorsque j'exclue l'espace de noms docbook du fichier xml. Mais les pauses, quand il a le namesapce. Pourquoi est-ce ainsi et comment peut-il être réparé? – Ace