Как сопоставить и обработать неизвестные элементы XML в XSLT 1.0? - PullRequest
0 голосов
/ 09 мая 2011

У меня есть простая таблица стилей XSLT 1.0, которая превращает документы XML в XHTML. Я действительно хочу иметь возможность «включать» содержимое файла XML в другой файл, когда это необходимо. AFAIK это просто невозможно в XSLT 1.0, поэтому я решил перенести свою обработку в простое Java-приложение, которое будет предварительно обрабатывать XML, рекурсивно выполнять «include» и передавать его процессору JDK XSLT по умолчанию. У меня есть XML-схема, которой должны соответствовать мои документы.

Наиболее часто используемый элемент называется «текст» и может иметь атрибут «id» и / или «class», который используется для стилевого оформления XHTML с помощью CSS. Этот элемент превращается в «p», «div» или «span» в зависимости от контекста.

Что я хотел бы добавить, так это возможность определять «неизвестные» элементы в моих входных файлах и преобразовывать их в «текстовый» элемент для дальнейшей обработки. Если имя «неизвестного» элемента начинается с заглавной буквы, то оно становится «текстовым», а «id» - исходным именем. Иначе «текст» с «классом», установленным на оригинальное имя. Все остальное в неизвестном элементе должно быть сохранено как есть, и затем оно должно быть обработано XSLT, как если бы оно было изначально во входном файле. Другими словами, я хотел бы преобразовать все неизвестные элементы в допустимый XML-документ, а затем обработать его с помощью моей таблицы стилей.

Может ли это быть сделано в XSLT, возможно, в «таблице стилей» предварительной обработки, или я должен сделать это в качестве предварительной обработки в Java? Производительность здесь не важна. Я бы предпочел решение XSLT, но не в том случае, если оно намного сложнее, чем в Java.

1 Ответ

0 голосов
/ 11 мая 2011

Ну, так как никто не ответил, я просто попробовал.Хотя это проще сделать в Java, у него есть один существенный недостаток: поскольку код должен знать действительные элементы, чтобы он мог распознавать неизвестные, в конечном итоге вам придется жестко закодировать его в своем коде и перекомпилировать, еслиШаблон XSLT изменяется.

Итак, я попробовал в XSLT, и это также работает.Допустим, у вас есть:

<xsl:template match="text">
    *processing*
    <xsl:call-template name="id_and_class"/>
    *processing*
</xsl:template>

, где шаблон с именем id_and_class копирует ваш атрибут id и классы в сгенерированный элемент, и вы хотите, чтобы неизвестные элементы были сопоставлены с элементами «text», тогда вы можете сделать это:

<xsl:template match="text">
    <xsl:call-template name="text_processing"/>
</xsl:template>

<xsl:template name="text_processing">
    *processing*
    <xsl:call-template name="text_id_and_class"/>
    *processing*
</xsl:template>
...
<xsl:template name="text_id_and_class">
     <xsl:choose>
        <!-- If name() is not "text", then we have an unknown element. -->
        <xsl:when test="name()!='text'">
            <!-- Processing of ID and class omitted ... -->
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="id_and_class"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
...
<!-- MUST BE LAST : Process unknown elements like a "text" element. -->
<xsl:template match="*">
   <xsl:call-template name="text_processing"/>
</xsl:template>

Если вы обрабатываете содержимое одного определенного элемента с именованным шаблоном, вы можете проверить в этом шаблоне, совпадает ли имя, и использовать его для специальной обработки.Тогда вам просто нужно положитьв конце таблицы стилей и оттуда вызовите названный шаблон.

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