2010-11-19 17 views
1

fileRef ImageObject üzerinde önceki klasörleri kaldırarak './' ve ilk klasör oXSL: Ben önceki kaldırmak istediğiniz

<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> 
den

Yani imageData ait herhangi fileRef için 'ekran' adlı değilse To

: Ekran İşte

<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> 

benim şimdiki stil olduğunu bölümüne ... nedense hiçbir şey yapmadan edilecek

<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> 

Düzenleme Eklenen xmlns = "http://docbook.org/ns/docbook" sürümü = "5" görünmez.

+0

İyi soru. +1. Muhtemelen XML belgeniz son sorunuzdan beri değişti. Tam ve basit bir çözüm için cevabımı görün. –

+0

Bu sorunu yeniden oluşturamıyorum. –

+0

@Alejandro: Doğru, fark ettim ki bölümün nslarını özledim. Sorumu buna göre düzenledim. – Ace

cevap

1

Bu dönüşüm:

<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> 
:

<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> 

aranan, doğru sonucu üretir: sağlanan XML belgesinin gerçekleştirilen

<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> 

+0

@Dimitre: Bu benim özgün yanıtımın aynısı: '' subst.de '' (., Substring-before (., '/ Screenhots /')) '' '' 'imagedata/@ fileref'' için. Ancak bu, bu özel gereksinimi ele almıyor: * 'Ekran resimleri' * olarak adlandırılmamışsa, önceki './' ve ilk klasörü kaldırmak istiyorum. Belki de talep açıklığa kavuşturulursa ... –

+0

@Alejandro: Çok doğru. Bu şimdi ekliyorum bir gereğidir. Garip olan şu ki, bu çözümlerin işe yarayacağını görüyorum ama tam anlamıyla hiçbir şey olmuyor. – Ace

+0

@Dimitre Yukarıdaki çözüm, docbook ad alanını xml'den çıkardığımda çalışır. Ama isimsiz olduğunda, kırılır. Neden böyle ve nasıl düzeltilebilir? – Ace

İlgili konular