Функция документа XSLT - иерархия папок - PullRequest
2 голосов
/ 14 июня 2011

Я работаю с xslt 1.0 и пытаюсь использовать функцию документа XSLT, чтобы применить таблицу стилей к иерархии папок.Структура папок указана ниже, но я не могу найти в Интернете надежных ссылок о том, как это сделать.

a/
└── b
    └── c
        ├── d
        ├── e
        ├── f

Есть ли способ применить свою таблицу стилей к узлам в файле,в папке f через файл в папке a (a содержит ссылки на имена файлов в иерархии папок).

Обновление № 2

book01.xml
<?xml version="1.0" encoding="utf-8" ?>
<book location="../collection/book01.xml">
    <chapter>chapter001</chapteer>
</book>

chapter01.xml
<?xml version="1.0" encoding="utf-8" ?>
<chapter location="../collection/book01/chapter01.xml">
    <page>page01</page>
</chapter>

page01.xml
<?xml version="1.0" encoding="utf-8" ?>
<page location="../collection/book01/chapter01/page01.xml">
    <pagenumber>page 1</pagenumber>
    <text>
      page one.
    </text>
</page>

Output

Book Name: Book XX
  Chapter XX
    Page XX
      page xx.

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

Я не уверен, что это выполнимый / разумный способ реализовать то, что вы хотите достичь в контексте вашего варианта использования; однако вы можете остаться с первоначальным планом, который работает с xsl:for-each и document().

Например, предположим, что у вас есть входной файл со списком путей:

<files>
    <file>book001.xml</file>
    <file>chapter001.xml</file>
</files>

Этот вход может быть разумно использован для определения переменной, содержащей все ваши входные документы и применения шаблонов:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    version="1.0">

    <xsl:template match="files">
        <xsl:variable name="docs">
            <docs>
                <xsl:for-each select="file">
                    <xsl:copy-of select="document(.)"/>
                </xsl:for-each>
            </docs>
        </xsl:variable>

        <xsl:apply-templates select="msxsl:node-set($docs)"/>
    </xsl:template>

    <!-- now you can match elements of your xml files -->

</xsl:stylesheet>

Обратите внимание, что мне нужна функция расширения для оценки набора узлов. Это определенно доступно в xsltproc , или вы можете получить его в любом случае из EXSLT.

В примере я предположил, что входной файл находится в той же папке, что и файл book001.xml и chapter001.xml.

0 голосов
/ 14 июня 2011

Многие процессоры XSLT 2.0 реализуют функцию collection () таким образом, чтобы вы могли опрашивать структуры каталогов в файловом хранилище. Мне неизвестны какие-либо эквивалентные расширения в процессорах XSLT 1.0.

0 голосов
/ 14 июня 2011

Если ссылки относительны, они сопоставляются с базовым URI исходной таблицы стилей, поэтому они могут не работать. В XSLT 2.0 для этого есть функция resolve-uri. <Ч /> Может быть, вы могли бы реализовать функцию расширения resol-uri.

...