2013-12-09 2 views
1

У меня есть набор xml-файлов в папке и вложенных папках, которые мне нужно немного изменить, изменив заголовок темы из UPPER CASE в Title Case.XSLT преобразует набор XML-файлов в папку и несколько подпапок

После изменение этого: ПЕРВЫЙ ПАРАГРАФ МОЕГО ИЗДАНИЯ должно выглядеть следующим образом: первый абзац моей публикации

Структура папки выглядит следующим образом Docs/документы/folder1, Docs/документы/folder2, Docs/documents/folder3 и т. д.

Я хотел бы использовать XSLT в сочетании с скриптом Ant или любым другим подходом для выполнения изменений. Перезапись исходных файлов в порядке, потому что мне нужно сохранить ту же структуру папок.

Этот подход XSLT: Transform XML files tree является самым близким к тому, чего я пытаюсь достичь, но я не в состоянии.

файлы XML источник выглядеть следующим образом:

<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd"> 
<topic xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" audience="(12-7-1)" 
    id="parag128" ditaarch:DITAArchVersion="1.0" 
    domains="(topic ui-d) (topic hi-d) (topic pr-d) (topic sw-d)       (topic ut-d)" 
    class="- topic/topic "> 

    <title class="- topic/title ">FIRST PARAGRAPH OF MY PUBLICATION</title> 

    <body class="- topic/body "> 

     <p class="- topic/p ">The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. 
     The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. 
     The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. 

     </p> 

    </body> 

</topic> 

И полученный XML должен быть как ниже:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd"> 
<topic xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" audience="(12-7-1)" 
    id="parag128" ditaarch:DITAArchVersion="1.0" 
    domains="(topic ui-d) (topic hi-d) (topic pr-d) (topic sw-d)       (topic ut-d)" 
    class="- topic/topic "> 

    <title class="- topic/title ">First Paragraph Of My Publication</title> 

    <body class="- topic/body "> 

     <p class="- topic/p ">The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. 
     The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. 
     The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. 

     </p> 

    </body> 

</topic> 

Я это XSLT

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:param name="files" select="collection('../../*.dita;recurse=yes')"/> 

<xsl:template match="topic/title/text()"> 
    <xsl:analyze-string select="." regex="\p{{L}}+"> 
     <xsl:matching-substring> 
      <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"/> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 

</xsl:template> 

от этого вопроса Converting to text to lowercase in nodes and child nodes in xsl, но я не могу заставить его работать с несколькими файлами.

Благодарим за помощь.

+0

Какая версия XSLT? –

+0

XSLT 2.0 с Saxon-EE 9.5.1.2 – ManUO

ответ

0

Вы используете xsl:collection() в xsl:parameter, но вы никогда не используете параметр.

Попробуйте сделать xsl:for-each над каждым документом в коллекции и создать новый документ с помощью xsl:result-document. Вы можете использовать document-uri, чтобы получить имя файла.

(ПРЕДУПРЕЖДЕНИЕ: В данном примере будет перезаписывать существующий файл, чтобы проверить, добавить расширение к href как href="{document-uri(current())}.test"!).

Кроме того, так как вы используете Saxon-EE, попробуйте использовать saxon:discard-document() функция расширения. Это приведет к удалению каждого документа из пула документов Saxon после его обработки. Это сделает его доступным для сбора мусора, чтобы вы не сдули свою память. (Если память беспокоит.)

Пример (проверен с использованием Saxon-EE 9.4):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/"> 
     <xsl:for-each select="collection('../../?recurse=yes;select=*.dita')/saxon:discard-document(.)" xmlns:saxon="http://saxon.sf.net/"> 
      <xsl:result-document href="{document-uri(current())}"> 
       <xsl:apply-templates/> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="topic/title"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:analyze-string select="." regex="\p{{L}}+"> 
       <xsl:matching-substring> 
        <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"/> 
       </xsl:matching-substring> 
       <xsl:non-matching-substring> 
        <xsl:copy-of select="."/> 
       </xsl:non-matching-substring> 
      </xsl:analyze-string>    
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Примечание: вход в эту таблицу стилей будет любой XML-документ. Я использовал таблицу стилей в качестве входных данных при тестировании.


Возможность игнорировать текст внутри parens. (PUBLICATION HEADING (ABCD) становится Publication Heading (ABCD))

<xsl:analyze-string select="." regex="\p{{L}}+|\([^\(\)]+\)"> 
    <xsl:matching-substring> 
     <xsl:choose> 
      <xsl:when test="matches(.,'^\(')"> 
       <xsl:value-of select="."/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"/>       
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:copy-of select="."/> 
    </xsl:non-matching-substring> 
</xsl:analyze-string> 

Это не может быть лучшим/наиболее расширяемым способом, но у меня было всего несколько минут.

+0

Упс! Извините @ManUO. Мне просто нужно добавить ''. Я обновлю. –

+0

Спасибо миллиону Даниэлю, можно ли исключить что-либо в круглых скобках внутри элемента title? Например, если у меня есть заголовок, который выглядит следующим образом: PUBLICATION HEADING (ABCD) преобразовать в Publication Heading (ABCD)? – ManUO

+0

@ManUO - Я добавил пример новой строки 'xsl: analysis-string'. Это может быть не самый лучший вариант, но это было быстро. :-) –

0

Используйте задачу Ant xslt, чтобы управлять приложением XSLT, поэтому у вас будет один запуск Saxon для каждого файла.

Имейте исходный и целевой каталог, чтобы вы ничего не перезаписывали. Во время тестирования вы будете счастливы. После того, как вы готовы начать жить, добавьте дополнительный шаг, чтобы скопировать все из целевого каталога обратно в исходный код. Дополнительные очки для копирования только в случае изменения.

+0

Большое вам спасибо за отзыв. Я пробовал подход к задачам Ant XSLT, но я продолжаю жаловаться на отсутствие DTD для темы DITA. – ManUO

+0

Хммм. Возможно, вы указали неверный путь для DTD или схемы. В любом случае вы можете загрузить DTD на свой локальный компьютер и сообщить Saxon, что вместо этого они должны использовать эти локальные копии. –

Смежные вопросы