Преобразование преобразованного XML с помощью XSL? - PullRequest
1 голос
/ 11 января 2012

Допустим, у меня есть XML-преобразователь XSL.Возможно ли, чтобы один и тот же лист XSL выполнил второй цикл по результирующему XML?Например, скажем, мой XSL превращает

<xml>
    <animal><dog>Rex</dog></animal>
    <animal><dog>Henry</dog></animal>
    <animal><dog>Fido</dog></animal>
</xml>

в

<xml>
    <dog>Rex</dog>
    <dog>Henry</dog>
    <dog>Fido</dog>
</xml>

Я не хочу выводить это;скорее, я тогда хочу выполнить больше XSL на основе TH, то есть результирующей структуры XML.

Практический пример?Я хочу добавить к каждому собачьему узлу количество исходящих собачьих братьев и сестер.Таким образом, в конечном итоге это будет выглядеть так:

<xml>
    <dog>Rex (2)</dog>
    <dog>Henry (1)</dog>
    <dog>Fido (0)</dog>
</xml>

Этого нельзя было сделать при первом цикле, потому что в начале XML узлы собаки не были братьями и сестрами - каждый из них жил внутри узла животного.1013 * [ EDIT : я знаю, что можно сделать путем опроса индекса родительского узла животного, но это только для этого надуманного примера;в общем, мне все еще нужно знать, как действовать с преобразованным XML - если это вообще возможно]

Надеюсь, это имеет какой-то смысл.Если есть действительно простой способ сделать это, будьте осторожны, потому что я не ниндзя XSL ...

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 11 января 2012

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

Существует два способа сделать это: таблица одних стилей и таблица нескольких стилей.В конвейере с одной таблицей стилей вы обычно используете режимы, по одному режиму для каждой фазы преобразования.Промежуточные результаты хранятся в переменных (это означает, что в XSLT 1.0 необходимо использовать xx: node-set (), чтобы сделать результат одной фазы доступным для обработки на следующей фазе).

Использование несколькихТаблицы стилей - последовательность преобразований, каждое из которых имеет свою собственную таблицу стилей XSLT, - немного сложнее настроить, поскольку для запуска конвейера требуется некоторый механизм управления.Но в конце концов это часто лучше, потому что код менее сложен и более пригоден для повторного использования.Существует несколько технологий, которые вы можете использовать для управления конвейером: Ant, XProc, сценарии оболочки, xmlsh, Orbeon, Coccoon или просто старая Java.

1 голос
/ 11 января 2012

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

<xsl:variable name="result1">
  <xsl:apply-templates select="xml" mode="m1"/>
</xsl:variable>

<xsl:variable name="result2">
  <xsl:apply-templates select="$result1/xml" mode="m2"/>
</xsl:variable>

<xsl:template match="/">
  <xsl:copy-of select="$result2"/>
</xsl:template>

<!-- now put templates for the modes here -->

Это выше подходит только для XSLT 2.0, однако, для XSLT 1.0 у вас есть недостаток, заключающийся в том, что временный результат является фрагментом дерева результатов, который необходимо преобразовать в набор узловсначала с функцией расширения, такой как exsl: node-set , поэтому для XSLT 1.0 вам нужно, например,

<xsl:variable name="result1">
  <xsl:apply-templates select="xml" mode="m1"/>
</xsl:variable>

<xsl:variable name="result2">
  <xsl:apply-templates select="exsl:node-set($result1)/xml" mode="m2"/>
</xsl:variable>

<xsl:template match="/">
  <xsl:copy-of select="$result2"/>
</xsl:template>

<!-- now put templates for the modes here -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...