Как преобразовать этот XML с XSLT? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующий XML:

<dev>
    <niv1>
        <int>blablabla</int>
        <auteur>blablabla</auteur>
        <exer>
            <p align="justif">blablabla</p>
        </exer>
    </niv1>
    <sign>M. A.</sign>
    <p align="justif">
        <pc>blablabla</pc>: blablabla2
    </p>

    <niv1>
        <int>blablabla</int>
        <auteur>blablabla</auteur>
        <exer>
            <p align="justif">blablabla</p>
        </exer>
    </niv1>
    <sign>M. A.</sign>
    <p align="justif">
        <pc>blablabla</pc>: blablabla2
    </p>
    <!--Same pattern over and over again-->
</dev>

Я бы хотел что-то вроде

<article>
  <content>
    <div>
       <some tags>xxxx</some tags>
    </div>
    <span class="sign">xxx</span>
     <p class="ref">
        <p class="mini-caps">xxxx</p>: 
     </p>
   </content>
</article>

Вывод xml, который у меня есть на данный момент, выглядит следующим образом:

<article>
  <content>
    <div>
       <some tags>xxxx</some tags>
    </div>
   </content>
</article>
<span class="sign">xxx</span>
<p class="ref">
      <p class="mini-caps">xxxx</p>: 
</p>

Мне не удается поместить последние элементы span и p в тег content.

Мой XSLT выглядит примерно так (не весь файл здесь):

<xsl:template match="niv1">
    <article>
        <content>
            <div>
                <xsl:apply-templates mode="content"/>
            </div>
            <xsl:apply-templates select="sign"/>
        </content>
    </article>
</xsl:template>

<xsl:template match="sign">
    <span class="sign">
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="p">
    <p class="ref">
        <xsl:apply-templates/>
    </p>
</xsl:template>

<xsl:template match="pc">
    <p class="mini-caps">
        <xsl:apply-templates/>
    </p>
</xsl:template>

Я не знаю, возможно ли достичь того, что я хочу, так как при совпадении <niv1>, <sign> и <p> не являются дочерними узлами niv1. Я не часто использую XSLT, и я довольно новичок.

1 Ответ

0 голосов
/ 05 июля 2018

Есть несколько изменений, которые вам нужно сделать, чтобы переместить братьев и сестер sign и p в дочерние элементы niv1.

Измените шаблон, соответствующий niv1, как показано ниже. В этом шаблоне первое вхождение братьев и сестер sign и p после niv1 было сделано его потомками с использованием режима, позволяющего впоследствии удалить братьев и сестер.

<xsl:template match="niv1">
    <article>
        <content>
            <div>
                <xsl:apply-templates mode="content"/>
            </div>
            <xsl:apply-templates select="following-sibling::sign[1]" mode="alter-sign" />
            <xsl:apply-templates select="following-sibling::p[1]" mode="alter-p" />
        </content>
    </article>
</xsl:template>

Режим применяется к шаблонам ниже

<xsl:template match="sign" mode="alter-sign">
    <span class="sign">
        <xsl:apply-templates />
    </span>
</xsl:template>

<xsl:template match="p" mode="alter-p">
    <p class="ref">
        <xsl:apply-templates />
    </p>
</xsl:template>

Любые другие вхождения sign и p удаляются.

<xsl:template match="sign | p" />

Эти изменения обеспечивают следующий вывод (поскольку в общем входе есть 2 вхождения niv1, на выходе отображаются 2 article узла).

<article>
    <content>
        <div>blablablablablablablablabla</div>
        <span class="sign">M. A.</span>
        <p class="ref">
            <p class="mini-caps">blablabla</p>  : blablabla2
        </p>
    </content>
</article>
<article>
    <content>
        <div>blablablablablablablablabla</div>
        <span class="sign">M. A.</span>
        <p class="ref">
            <p class="mini-caps">blablabla</p>  : blablabla2
        </p>
    </content>
</article>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...