XSL: удаление предыдущих папок в пути к изображению - PullRequest
2 голосов
/ 20 октября 2010

Я хочу удалить предшествующую «./» и первую папку, если она не называется «скриншоты»

То есть с

<image href="./folderx/screenshots/page1.png">
<image href="./screenshots/page2.png"/>
<image href="./views/screenshots/table/screenshots/page3.png"/>

до

<image href="screenshots/page1.png">
<image href="screenshots/page2.png"/>
<image href="screenshots/table/screenshots/page3.png"/>

Решение, приведенное ниже, делает это:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE reference
  PUBLIC "-//OASIS//DTD DITA Composite//EN" "http://docs.oasis-open.org/dita/v1.1/OS/dtd/reference.dtd">
<reference id="sample">
   <title>Sample Title</title>
   <refbody>
      <section>
         <title>Breadcrumb</title>
         <p>
            <xref href=""/>  
            <xref href=""/>
            <xref href=""/>
         </p>
      </section>
      <section>
         <title>Screenshot</title>
         <p id="Typ1e">
            <image href="./views/screenshots/Type1.png" placement="break"/>
         </p>
         <p id="Type2">
            <image href="./views/screenshots/Type2.png" placement="break"/>
         </p>
      </section>
   </refbody>
</reference>

Кому:

<reference xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" id="sample"
           ditaarch:DITAArchVersion="1.2"
           domains="(topic concept)                            (topic concept glossentry)                            (topic concept glossgroup)                            (topic reference)                            (topic task)                            (topic hi-d)                             (topic ut-d)                             (topic indexing-d)                            (topic hazard-d)                            (topic abbrev-d)                            (topic pr-d)                             (topic sw-d)                            (topic ui-d)                             (topic task strictTaskbody-c)    "
           class="- topic/topic       reference/reference ">
   <title class="- topic/title ">Sample Title</title>
   <refbody class="- topic/body        reference/refbody ">
      <section class="- topic/section ">
         <title class="- topic/title ">Breadcrumb</title>
         <p class="- topic/p ">
            <xref href="" class="- topic/xref "/>  
            <xref href="" class="- topic/xref "/>
            <xref href="" class="- topic/xref "/>
         </p>
      </section>
      <section class="- topic/section ">
         <title class="- topic/title ">Screenshot</title>
         <p id="Typ1e" class="- topic/p ">
            <image href="screenshots/Type1.png" placement="break" class="- topic/image "/>
         </p>
         <p id="Type2" class="- topic/p ">
            <image href="screenshots/Type2.png" placement="break" class="- topic/image "/>
         </p>
      </section>
   </refbody>
</reference>

Использование XSLT:

<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=
        "image/@href[starts-with(.,'./')
        and not(starts-with(.,'./screenshots/'))
        ]">
        <xsl:attribute name="href">
            <xsl:value-of select="substring-after(substring-after(.,'./'), '/')"/>
        </xsl:attribute>
    </xsl:template>

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

Я не уверен, имеет ли это значение, но я использую oXygen 12.0

1 Ответ

1 голос
/ 20 октября 2010

Обновление : ОП (@Ace) изменил свой вопрос и сообщает, что приведенное ниже преобразование создает некоторые новые дополнительные атрибуты.

Этот эффект связан с тем, что ониспользование <!DOCTYPE и связанного DTD дает некоторые атрибуты по умолчанию для некоторых элементов.

Итак, ничего нового или удивительного!:)

Это всегда происходит, когда у вас есть инструкция <!DOCTYPE, которая связывает DTD с документом, и когда это DTD имеет атрибуты по умолчанию.

Чтобы удалить атрибуты, если онине требуется, можно добавить соответствующие шаблоны с пустым телом. Однако имейте в виду, что это может сделать весь результат недействительным для DTD !


Это механическое переопределение правила идентификации:

<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=
   "image/@href[starts-with(.,'./')
              and not(starts-with(.,'./screenshots/'))
                ]">
  <xsl:attribute name="href">
   <xsl:value-of select="substring-after(substring-after(.,'./'), '/')"/>
  </xsl:attribute>
 </xsl:template>

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

когда это преобразование применяется к следующему документу XML :

<t>
    <image href="./folderx/screenshots/page1.png"/>
    <image href="./screenshots/page2.png"/>
    <image href="./views/screenshots/table/screenshots/page3.png"/>
</t>

желаемый результат получается :

<t>
    <image href="screenshots/page1.png"></image>
    <image href="screenshots/page2.png"></image>
    <image href="screenshots/table/screenshots/page3.png"></image>
</t>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...