2012-05-29 1 views
0

Я хочу написать шаблон для обработки некоторого раздела и его повторного использования.Создание многоразового шаблона в xslt для обработки нескольких элементов, которые происходят несколько раз

В приведенном ниже XML мы видим, что сообщение повторяется в каждом. Я хочу написать шаблон для обработки и назвать его когда когда-либо понадобится.

 <Data> 

      <A> 
       <text>this is text</text> 
       <Message> 
       <local>Local link</local> 
       <STD>External link</STD> 
       </Message> 
      </A> 
      <B> 
       <info>Information</info> 
       <Message> 
       <local>Local uri link</local> 
       <STD>External link uri</STD> 

       </Message> 
      </B> 
      <C> 
       <longtext>Long Text</longtext> 
       <Message> 
       <local>Local uri link</local> 
       <STD>External link uri</STD> 

       </Message> 
       </C> 
     <Data> 

Выход необходимо:

<Information>  
      <AA> 
       this is text 
       <MSG local value="Local uri link" STD value="External link"/> 
      </AA> 

      <BB> 
       Information 
       <MSG local value ="Local uri link" STD value="External link"/> 

      </BB> 
      <CC> 
       Long Text 
       <MSG local value="Local uri link" STD value="External link"/> 
      </CC> 

    <Information> 

При обработке тега в каждом узле, я пишу код для каждого тегов A, B, C.

Пример кода, написанного

<Information> 

     <xsl:template match="A"> 
     <AA> 
      <xsl:value-of select="text"/> 
      <xsl:element name="MSG"> 
       <xsl:attribute name="local value"> 
        <xsl:value-of select="Message/local"/> 
       </xsl:attribute> 
       <xsl:attribute name="STD value"> 
        <xsl:value-of select="Message/STD"/> 
       </xsl:attribute> 
     </AA> 
    </Information> 

Аналогично для каждого шаблона я явно пишу код для блока MSG.

Теперь я хочу написать отдельный шаблон для обработки. И я хочу назвать этот шаблон из каждого шаблона.

В основном я хочу, чтобы повторно использовать код, написанный для обработки

Может ли один помочь мне, как это сделать.

спасибо.

ответ

3

Вот пример:

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

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

<xsl:template match="Data"> 
    <Information> 
    <xsl:apply-templates/> 
    </Information> 
</xsl:template> 

<xsl:template match="Data/*"> 
    <xsl:element name="{local-name()}{local-name()}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="Data/A/text | Data/B/info | Data/C/longtext"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="Message"> 
    <MSG local-value="{local}" STD-value="{STD}"/> 
</xsl:template> 

</xsl:stylesheet> 

При подаче на вход

<Data> 

    <A> 
     <text>this is text</text> 
     <Message> 
     <local>Local link</local> 
     <STD>External link</STD> 
     </Message> 
    </A> 
    <B> 
     <info>Information</info> 
     <Message> 
     <local>Local uri link</local> 
     <STD>External link uri</STD> 

     </Message> 
    </B> 
    <C> 
     <longtext>Long Text</longtext> 
     <Message> 
     <local>Local uri link</local> 
     <STD>External link uri</STD> 

     </Message> 
     </C> 
</Data> 

Saxon 6.5.5 выходы

<?xml version="1.0" encoding="utf-8"?><Information> 

      <AA> 
       this is text 
       <MSG local-value="Local link" STD-value="External link"/> 
      </AA> 
      <BB> 
       Information 
       <MSG local-value="Local uri link" STD-value="External link uri"/> 
      </BB> 
      <CC> 
       Long Text 
       <MSG local-value="Local uri link" STD-value="External link uri"/> 
       </CC> 
     </Information> 

Ни Опубликованная образец ввода, ни разыскиваемый образец вывода являются хорошо сформированным XML, поэтому мне пришлось внести некоторые изменения в имена элементов или атрибутов для обработки, а также для вывода XML.

+0

Благодарим за предоставленную информацию. Есть ли возможность написать шаблон для обработки тега сообщения отдельно и вызвать его, когда это необходимо, путем передачи текста. – Patan

+0

просто . при прохождении параметра i нужно передать все дерево xml под тегом Message – Patan

+0

@ User222, это совсем не ясно, что вы хотите, какое требование не соответствует решению Мартина? –

 Смежные вопросы

  • Нет связанных вопросов^_^