xslt 1.0 - преобразовать узлы перед конкретным элементом в другой элемент - PullRequest
1 голос
/ 10 января 2011

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

<p>
    XYZZ
    <nl/>
    DEF
    <process>gggg</process>
    KKK
    <nl/>
    JKLK
    <nl/>
    QQQQ
</p>

Мне нужно, чтобы каждый узел, разделенный на элемент <nl/>, выводился в элементе <title>:

<p>      
    <title>XYZZ</title>  
    <title>
        DEF<process>gggg</process>KKK  
    </title>  
    <title>JKLK</title>  
    <title>QQQQ</title>  
</p>

` Пожалуйста, предложите мне способ получения указанного вывода.

1 Ответ

0 голосов
/ 10 января 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key  name="kFollowing" match="/*/node()[not(self::nl)]"
  use="generate-id(preceding-sibling::nl[1])"/>

 <xsl:key  name="kPreceding" match="/*/node()[not(self::nl)]"
  use="generate-id(following-sibling::nl[1])"/>

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

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

    <xsl:template match="nl" name="groupFollowing">
      <title>
       <xsl:apply-templates select="key('kFollowing',generate-id())"/>
      </title>
    </xsl:template>

    <xsl:template match="nl[1]">
     <title>
       <xsl:apply-templates select="key('kPreceding',generate-id())"/>
     </title>
     <xsl:call-template name="groupFollowing"/>
    </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<p>
       XYZZ
       <nl/>
       DEF
       <process> gggg </process>
       KKK
       <nl/>
       JKLK
       <nl/>
       QQQQ
</p>

дает желаемый, правильный результат :

<p>
   <title>
       XYZZ
       </title>
   <title>
       DEF
       <process> gggg </process>
       KKK
       </title>
   <title>
       JKLK
       </title>
   <title>
       QQQQ
</title>
</p>

Примечание :

  1. Правило идентификации используется для копирования узлов "как есть".

  2. Существуют специальные шаблоны , соответствующие верхнему элементу, первому nl дочернему элементу верхнего элемента и любому nl дочернему элементу верхнего элемента.

  3. Определены два ключа, которые выбирают все не nl узлы , которые непосредственно предшествуют элементу nl, и все узлы, которые непосредственно следуют за элементом nl.

  4. Элемент nl заменяется элементом title , и обрабатываются все сразу следующие узлы, кроме nl, и результат помещается в этот элемент title.

  5. Для первого (дочернего по отношению к его родительскому) элемента nl существует начальный шаг , на котором добавляется элемент title и все непосредственно предшествующие узлы, не являющиеся nl обрабатываются, и результат помещается в этот title элемент. Затем выполняется обработка на шаге 4. выше.

...