Изменение расширений в файле XML - PullRequest
2 голосов
/ 28 октября 2010

Это немного сложнее. У меня есть файл contents.xml, который ссылается на множество других файлов. Эти другие файлы используются в формате .xml и были изменены на .dita, мой вопрос: как я могу переименовать все расширения .xml в .dita? Пути к файлам являются различными уровнями в дереве и имеют непоследовательное количество подпапок перед ними.
Пример:

<article
    xmlns:xi="http://www.w3.org/2001/XInclude">

   <title>Definition</title>
   <xi:include href="./introduction.xml"/>
   <section xml:id="viewComponents"><title>View Components</title>
      <xi:include href="./components/page.xml"/>
      <xi:include href="./views/sheet.xml"/>
      <xi:include href="./folder/xsubfolders/plaque.xml"/>
   </section>
</article>

Кому:

<article
    xmlns:xi="http://www.w3.org/2001/XInclude">

   <title>Definition</title>
   <xi:include href="./introduction.dita"/>
   <section xml:id="viewComponents"><title>View Components</title>
      <xi:include href="./components/page.dita"/>
      <xi:include href="./views/sheet.dita"/>
      <xi:include href="./folder/xsubfolders/plaque.dita"/>
   </section>
</article>

Ответы [ 2 ]

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

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xi="http://www.w3.org/2001/XInclude">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match=
   "xi:include/@href[substring(., string-length()-3)='.xml']">
  <xsl:attribute name="href">
    <xsl:value-of select="concat(substring(.,1, string-length()-3),'dita')"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу :

<article
    xmlns:xi="http://www.w3.org/2001/XInclude">

   <title>Definition</title>
   <xi:include href="./introduction.xml"/>
   <section xml:id="viewComponents"><title>View Components</title>
      <xi:include href="./components/page.xml"/>
      <xi:include href="./views/sheet.xml"/>
      <xi:include href="./folder/xsubfolders/plaque.xml"/>
   </section>
</article>

создает искомое, правильный результат :

<article xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Definition</title>
    <xi:include href="./introduction.dita"></xi:include>
    <section xml:id="viewComponents">
        <title>View Components</title>
        <xi:include href="./components/page.dita"></xi:include>
        <xi:include href="./views/sheet.dita"></xi:include>
        <xi:include href="./folder/xsubfolders/plaque.dita"></xi:include>
    </section>
</article>
0 голосов
/ 28 октября 2010

Вы можете сделать это с помощью рекурсии:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


    <xsl:template match="@*">
        <xsl:choose>
            <xsl:when test="substring(string(.), string-length(string(.)) - 3) = '.xml'">
                <xsl:attribute name="{name()}">
                    <xsl:value-of select="concat(substring(string(.), 1, string-length(string(.)) - 4), '.dita')"/>
                </xsl:attribute>
            </xsl:when>
            <xsl:otherwise>
                <xsl:attribute name="{name()}"><xsl:value-of select="string(.)"/></xsl:attribute>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

Шаблон внизу копирует весь ввод непосредственно в вывод, за исключением атрибутов, которые подобраны шаблоном выше, и здесь применяется преобразование текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...