Объединение документов XSL - PullRequest
       2

Объединение документов XSL

0 голосов
/ 13 октября 2010

Я использовал XSL для преобразования документа docbook в dita. Преобразование прошло успешно, но есть нежелательные артефакты, которые остаются. Я избавился от некоторых из них, но я сохранил эти изменения в другом XSL, который запускается после преобразования. Мой вопрос: возможно ли объединить это в один XSL? когда я пытался добавить код после docbook2dita.xsl, он, казалось, не имел никакого эффекта, я что-то упустил?

Также я думал об изменении внешней ссылки, используемой в docbook, на связанные ссылки в DITA. Это хорошая идея? с какими проблемами сталкиваются ppl с xref, что необходимо создать соответствующие ссылки?

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Возможно ли объединить это в один XSL?

Можно выразить это в одном преобразовании с помощью нескольких модулей таблиц стилей.

Если вы неЧтобы не знать, как работает DITA XSLT, лучше всего было бы: использовать import объявление для XSLT DITA и объявить свои собственные правила.

Редактировать : Пример.Предположим, эта таблица стилей base.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="root">
        <html>
            <xsl:apply-templates/>
        </html>
    </xsl:template>
    <xsl:template match="parent">
        <p>
            <xsl:apply-templates/>
        </p>
    </xsl:template>
    <xsl:template match="child">
        <b>
            <xsl:apply-templates/>
        </b>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<root>
    <parent>
        <child>1</child>
    </parent>
    <parent>
        <child>2</child>
    </parent>
    <parent>
        <child>3</child>
    </parent>
    <parent>
        <child>4</child>
    </parent>
</root>

Вывод:

<html>
    <p>
        <b>1</b>
    </p>
    <p>
        <b>2</b>
    </p>
    <p>
        <b>3</b>
    </p>
    <p>
        <b>4</b>
    </p>
</html>

Теперь эта таблица стилей использует import.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="base.xsl"/>
    <xsl:template match="parent">
        <div>
            <xsl:apply-templates/>
        </div>
    </xsl:template>
</xsl:stylesheet>

Выход:

<html>
    <div>
        <b>1</b>
    </div>
    <div>
        <b>2</b>
    </div>
    <div>
        <b>3</b>
    </div>
    <div>
        <b>4</b>
    </div>
</html>
1 голос
/ 13 октября 2010

Можно применить два или более преобразований в последовательности (цепочке), каждое из которых работает с результатом предыдущего.

Вот как объединить два преобразования в XSLT 2.0 (пример XSLT 1.0 аналогичен, но необходимо использовать функцию xxx:node-set() для каждого промежуточного результата):

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vPass1">
  <xsl:apply-templates select="/*"/>
 </xsl:variable>

 <xsl:template match="node()|@*" name="id" mode="#default pass2">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*" mode="#current"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
  <xsl:apply-templates select="$vPass1" mode="pass2"/>
 </xsl:template>

 <xsl:template match="num/text()">
  <xsl:value-of select="2*."/>
 </xsl:template>

 <xsl:template match="num/text()" mode="pass2">
  <xsl:value-of select="1+."/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML:

<nums>
 <num>1</num>
 <num>2</num>
 <num>3</num>
 <num>4</num>
 <num>5</num>
</nums>

два преобразования применяются в последовательности.Результатом первого преобразования является новый XML-документ, в котором значение каждого узла num/text() равно удвоенному значению исходного узла num/text().Второе преобразование применяется к этому промежуточному результату, и его действие заключается в добавлении 1 к каждому num/text() узлу и получении этого результата в качестве нового соответствующего узла `num / text () '.

Таким образом, результатом вычисления является то, что каждый $n (значение каждого num/text() узла) преобразуется в 2*$n+1:

<nums>
   <num>3</num>
   <num>5</num>
   <num>7</num>
   <num>9</num>
   <num>11</num>
</nums>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...