Изменение порядка узлов в xml с использованием xslt - PullRequest
0 голосов
/ 20 мая 2010

Как я могу преобразовать XML как это:

<xml>
   <paragraph>
        <data>
            <label> title </label>
         </data>
         <data>
            <label> subtitle </label>
         </data>

         <data>
            <label> text </label>
         </data>

         <data>
            <label> image </label>
         </data>
   </paragraph>
</xml>

В следующем xml (изображение перед текстом):

<xml>
   <paragraph>
        <data>
            <label> title </label>
         </data>
         <data>
            <label> subtitle </label>
         </data>
         <data>
            <label> image </label>
         </data>
         <data>
            <label> text </label>
         </data>
   </paragraph>
</xml>

Мне действительно нужно вызывать шаблон изображений, а не текст, если следующим узлом является изображение. (Источник xml в этом поле грязный)

Затем я копирую код, который использую xslt:

                  <xsl:when test="etiqueta = 'Imagen'">
                    <xsl:call-template name="imprimeImagenParrafo">
                      <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                      <xsl:with-param name="valor" select="valor"></xsl:with-param>
                      <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                      <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                      <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                      <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                    </xsl:call-template>
                  </xsl:when>
                </xsl:when>

1 Ответ

4 голосов
/ 20 мая 2010

Вам придется настроить это в соответствии с вашими данными (я предполагаю, что образец исходного документа не совсем то, что у вас есть), но, возможно, это вдохновит вас:

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

<!-- Identity copy that just passes through everything -->
<xsl:template match="@*|node()">
  <xsl:apply-templates select="@*|node()"/>
</xsl:template>

<!-- Here we match the paragraph element, copy it and its attrs, then rearrange it's children -->
<xsl:template match="paragraph">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <!-- Edit the predicates as necessary for your real data -->
    <!-- predicates are the things in the []...like the WHERE in a SQL query -->
    <xsl:apply-templates select="data[normalize-space(label) = 'title']"/>
    <xsl:apply-templates select="data[normalize-space(label) = 'subtitle']"/>
    <xsl:apply-templates select="data[normalize-space(label) = 'image']"/>
    <xsl:apply-templates select="data[normalize-space(label) = 'text']"/>
  </xsl:copy>
</xsl:template>

Удачи, David

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