2010-11-19 1 views
1

fileref 된 ImageObject에 이전 폴더를 제거하는 './' 첫 번째 폴더를이XSL : 나는 이전 제거 할

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

그래서 imageData의에 속한 fileref에 대한 '스크린 샷'라는 이름되지 않은 경우 으로

: 스크린 샷 여기

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

내 현재의 스타일입니다 섹션 ... 어떤 이유로 아무것도하지 않고 할

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

편집 추가의 xmlns = "http://docbook.org/ns/docbook"버전 = "5"를 표시하지 않습니다.

+0

좋은 질문입니다. +1. 아마도 마지막 질문 이후 XML 문서가 변경되었을 것입니다. 완전하고 간단한 솔루션에 대한 내 대답을 참조하십시오. –

+0

이 문제는 재현 할 수 없습니다. –

+0

@Alejandro : 당신이 맞아요, 방금 섹션의 ns를 놓친 것으로 나타났습니다. 그에 따라 내 질문을 편집했습니다. – Ace

답변

1

이 변환 :

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

가 원하는 정확한 결과를 생성 : 제공된 XML 문서 수행

<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 : 모든 imagedata/@ fileref'에 대해 원래의 대답 인'substring-after (., substring-before (., '/ screenshots /'))'와 같습니다. 그러나 이것은 특정 재 요구 사항을 다루지 않습니다. * '스크린 샷'*이 아닌 경우 선행 './'및 첫 번째 폴더를 제거하고 싶습니다. 어쩌면 조건이 분명 해지면 ... –

+0

@Alejandro : 맞아. 그것은 지금 제가 추가하는 요구 사항입니다. 이상한 점은 이러한 해결책이 효과가 있다는 것을 알았지 만 문자 그대로 아무것도 일어나지 않습니다. – Ace

+0

@Dimitre 위의 솔루션은 xml에서 docbook 네임 스페이스를 제외 할 때 작동합니다. 하지만 이름표가있을 때 휴식합니다. 이것이 왜 그렇게되며 어떻게 고칠 수 있습니까? – Ace