2017-02-20 33 views
0

Я хочу обрабатывать узлы с применением шаблонов, но использовать разные режимы для соответствия правильному шаблону правил для всех узлов в последовательности.Применить шаблоны с различными режимами

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<story> 
    <p class="h1"> 
     <content>heading</content> 
     <br/> 
    </p> 
    <p> 
     <content>some text</content> 
     <br/> 
     <content>more text...</content> 
    </p> 
</story> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:element name="div"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="p"> 
     <xsl:choose> 
      <xsl:when test="@class='h1'"> 
       <xsl:element name="h1"> 
        <!--apply-tempaltes mode:#default, for br mode:ignore--> 
        <xsl:apply-templates/> 
       </xsl:element> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:element name="p"> 
        <!--apply-tempaltes mode:#default--> 
        <xsl:apply-templates/> 
       </xsl:element> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="content" mode="#default"> 
     <xsl:element name="span"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="br" mode="#default"> 
     <xsl:element name="br"/> 
    </xsl:template> 

    <xsl:template match="br" mode="ignore"/> 

</xsl:stylesheet> 

Wanted Выход:

<?xml version="1.0" encoding="UTF-8"?> 
<story> 
    <h1 class="h1"><span>heading</span>  
    </h1> 
    <p><span>some text</span> 
     <br/> 
     <span>more text...</span> 
    </p> 
</story> 

XSLT-версия 2,0. Я знаю, есть другие способы добиться желаемого вывода для этого примера, но я бы хотел использовать атрибуты mode.

+0

Вы не сказали нам, что разыскиваемый выход. Должны ли мы читать ваши мысли? Я понятия не имею, что это значит: _ "apply-tempaltes mode: #default, for br mode: #ignore" _. Вы должны сказать нам, что вы пытаетесь выполнить. – JLRishe

+0

Я хочу знать, если я могу использовать разные режимы для всех элементов в последовательности. '# default' не будет работать, как только я буду использовать режим' ignore'. я мог бы пойти с 'mode =" # all "' для шаблона 'match =" content "'. Я уверен, есть лучшее решение. – Ferestes

+0

Все еще неясно, пожалуйста, расскажите нам об _goal_, а не о режимах. Вы хотите игнорировать (то есть: не копировать в результирующий документ) элементы 'br', если они находятся внутри элемента' p [@class = 'h1'] '? –

ответ

2

AFAICT, что вы хотите сделать:

XSLT 2,0

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

<!-- identity transform --> 
<xsl:template match="@*|node()" mode="#all"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" mode="#current"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="p[@class='h1']"> 
    <h1 class="h1"> 
     <xsl:apply-templates mode="h1"/> 
    </h1> 
</xsl:template> 

<xsl:template match="content" mode="#all"> 
    <span> 
     <xsl:apply-templates mode="#current"/> 
    </span> 
</xsl:template> 

<xsl:template match="br" mode="h1"/> 

</xsl:stylesheet> 
+0

'mode =" # all "' делает трюк в этом случае, спасибо. Я полагаю, что нет способа обрабатывать элементы последовательности с разными режимами в зависимости от их имен? – Ferestes

+0

Я не уверен, что вы подразумеваете под этим. Обычно шаблон соответствует узлам по их имени, поэтому нет необходимости в том, чтобы «режим» делал то же самое. Вы используете 'mode', когда у вас есть два шаблона с одинаковым (или перекрывающимся) шаблоном соответствия. Обратите внимание, что вышеупомянутое может быть достигнуто без использования 'mode'at all, просто' '. –

+1

Я не уверен, что это важно для задачи в этом вопросе, но преобразование идентичности XSLT 2.0 с режимами требует '' вместо '', чтобы работать с любым режимом. –