2.1. Convert explicitly or implicitly selected ``para`` to a ``formalpara``
Prev | 2. Commented examples | Next

### 2.1. Convert explicitly or implicitly selected ``para`` to a ``formalpara``

    <command name="paraToFormalpara">
      <macro>
        <sequence>
          <command name="selectNode"
                   parameter="ancestorOrSelf[implicitElement] para" />
          <command name="toFormalpara" />
          <command name="paste" parameter="to %_" />
        </sequence>
      </macro>
    </command>

    <command name="toFormalpara">
      <process showProgress="false">
        <copyDocument selection="true" to="in.xml" />
        <transform stylesheet="toFormalpara.xsl" cacheStylesheet="true"
                   file="in.xml" to="out.xml" />
        <read file="out.xml" encoding="UTF-8" />
      </process>
    </command>

In the above example, `toFormalpara.xsl` is simply:

    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" encoding="UTF-8" />

    <xsl:template match="/para">
      <formalpara>
        <xsl:for-each select="@*">
          <xsl:copy/>
        </xsl:for-each>

        <title></title>
        <para>
          <xsl:apply-templates select="node()"/>
        </para>
      </formalpara>
    </xsl:template>

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

    </xsl:stylesheet>

### Note

Adding the following generic rule to any XSLT style sheet used in interactive process commands allows to handle the case where the user has selected multiple nodes:

    <xsl:template match="/*[./processing-instruction('select-child-nodes')]">
      <xsl:variable name="pi"
        select="./processing-instruction('select-child-nodes')" />
      <xsl:variable name="first" select="substring-before($pi, '-')" />
      <xsl:variable name="last" select="substring-after($pi, '-')" />

      <c:clipboard
        xmlns:c="http://www.xmlmind.com/xmleditor/namespace/clipboard">

        <xsl:for-each select="child::node()[position() &gt;= $first and
                                            position() &lt;= $last]">
          <xsl:apply-templates select="." />
        </xsl:for-each>

      </c:clipboard>
    </xsl:template>

### Tip

The above macro may be implemented more efficiently by replacing the invocation of process command `toFormalpara` by a `transform` child element of `macro`. See Example 4.8, “Convert a `DocBook 5 para` to a `formalpara`”.

Prev | Up | Next
2. Commented examples | Home | 2.2. Convert a DocBook document to RTF