2016-02-04 2 views
0

Я пишу шаблон, в котором, если существует инструкция обработки, содержащая main после footnote и никакого другого footnote между этими два (the processing instruction и current footnote) мне нужна линия, которую нужно добавить.соответствие предшествующего текстовый элемента содержит

Ниже мой XML.

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <?xpp MAIN;2;0;0;0;45;0;0?> 
    <?xpp foot;art10_ft7;suppress?> 
    <?xpp FOOT;art10_ft7;1?> 
    <footnote label="7" id="art10_ft7"> 
     <para> 
        text 
      </para> 
    </footnote> 
    <?xpp foot;art10_ft8;suppress?> 
    <?xpp FOOT;art10_ft8;1?> 
    <footnote label="8" id="art10_ft8"> 
     <para> 
        text 
      </para> 
    </footnote> 
    <?xpp foot;art10_ft9;suppress?> 
    <?xpp FOOT;art10_ft9;1?> 
    <footnote label="9" id="art10_ft9"> 
     <para> 
        text 
      </para> 
    </footnote> 
    <?xpp MAIN;3;0;0;0;46;0;0?> 
    <?xpp foot;art10_ft20;suppress?> 
    <?xpp FOOT;art10_ft20;1?> 
    <footnote label="20" id="art10_ft20"> 
     <para>text</para> 
    </footnote> 
    <?xpp foot;art10_ft20;suppress?> 
    <?xpp FOOT;art10_ft20;1?> 
    <footnote label="21" id="art10_ft20"> 
     <para>text</para> 
    </footnote> 
    <?xpp foot;art10_ft20;suppress?> 
    <?xpp FOOT;art10_ft20;1?> 
    <footnote label="22" id="art10_ft20"> 
     <para>text</para> 
    </footnote> 
    <?xpp MAIN;3;0;0;0;46;0;0?> 
    <?xpp foot;art10_ft20;suppress?> 
    <?xpp FOOT;art10_ft20;1?> 
    <footnote label="23" id="art10_ft20"> 
     <para>text</para> 
    </footnote> 

</body> 

И я пытаюсь использовать ниже XSLT.

<xsl:template match="footnote" mode="footnote"> 
    <xsl:variable name="count" select="count(preceding::footnote)+1"/> 
    <div class="tr_footnote"> 
     <div class="footnote"> 
      <sup> 
       <a> 
        <xsl:attribute name="name"><xsl:text>ftn.</xsl:text><xsl:value-of select="$count"/></xsl:attribute> 
        <xsl:attribute name="href"><xsl:text>#f</xsl:text><xsl:value-of select="$count"/></xsl:attribute> 
        <xsl:attribute name="class"><xsl:text>tr_ftn</xsl:text></xsl:attribute> 
        <xsl:value-of select="@label"/> 
       </a> 
      </sup> 
      <xsl:apply-templates/> 
     </div> 
    </div> 
    <!--Here I need the change--> 
    <xsl:if test="following::processing-instruction('xpp')/text()[contains(.,'MAIN')][1][preceding::footnote[1]/@label=./@label]"> 
     <xsl:text>-------------------------</xsl:text> 
    </xsl:if> 
</xsl:template> 

В настоящее время я получаю выходной сигнал ниже.

<section class="tr_footnotes"><hr /><?pb label=''?> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.1" href="#f1" class="tr_ftn">7</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.2" href="#f2" class="tr_ftn">8</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.3" href="#f3" class="tr_ftn">9</a></sup>     
      <para>text</para>    
     </div> 
     </div><?pb label=''?> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.4" href="#f4" class="tr_ftn">20</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.5" href="#f5" class="tr_ftn">21</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.6" href="#f6" class="tr_ftn">22</a></sup>     
      <para>text</para>    
     </div> 
     </div><?pb label=''?> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.7" href="#f7" class="tr_ftn">23</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
    </section> 

И мой ожидается выход

<!DOCTYPE html 
    PUBLIC "XSLT-compat"> 
<hmtl> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>New Version!</title> 
    </head> 
    <section class="tr_footnotes"><hr /><?pb label=''?> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.1" href="#f1" class="tr_ftn">7</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.2" href="#f2" class="tr_ftn">8</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.3" href="#f3" class="tr_ftn">9</a></sup>     
      <para>text</para>    
     </div> 
     </div>-------------------------<?pb label=''?> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.4" href="#f4" class="tr_ftn">20</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.5" href="#f5" class="tr_ftn">21</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.6" href="#f6" class="tr_ftn">22</a></sup>     
      <para>text</para>    
     </div> 
     </div>-------------------------<?pb label=''?> 
     <div class="tr_footnote"> 
     <div class="footnote"><sup><a name="ftn.7" href="#f7" class="tr_ftn">23</a></sup>     
      <para>text</para>    
     </div> 
     </div> 
    </section> 
</hmtl> 

условие является таким образом. есть footnote и following, там есть инструкции по обработке, они 2 типа. <?xpp MAIN;2;0;0;0;45;0;0?> и <?xpp foot;art10_ft7;suppress?>. И вот мой запрос: мне нужно сопоставить following processing instructioncontainingMAIN, и не должно быть никаких других footnote между current footnote и processing instruction, и если это условие согласовано, мне нужно нарисовать линию.

Я использую следующий xpath для соответствия условию. Но это работает не так, как ожидалось.

<xsl:if test="following::processing-instruction('xpp')/text()[contains(.,'MAIN')][1][preceding::footnote[1]/@label=./@label]"> 
      <xsl:text>-------------------------</xsl:text> 
     </xsl:if> 

, пожалуйста, дайте мне знать, как я могу это сделать.

Благодаря

ответ

1

Попробуйте следующее выражение в вашем test (отформатирован для удобства чтения) *:

following-sibling::processing-instruction('xpp') 
    [contains(.,'MAIN')] 
    [1] 
    [preceding-sibling::footnote[1]/@label=current()/@label] 

Вы можете использовать более конкретной оси following-sibling здесь, так как все элементы, которые имеют значение находятся на том же уровне, в пределах тот же родительский элемент. Затем возникает ошибка ./@label в конце исходного выражения test. Контекст processing-instruction('xpp')/text(), который не имеет такого атрибута label. Вы должны использовать current() для переключения контекста в данный момент соответствуют footnote:

<!--Here I need the change--> 
<xsl:if test="following-sibling::processing-instruction('xpp')[contains(.,'MAIN')][1][preceding-sibling::footnote[1]/@label=current()/@label]"> 
    <xsl:text>-------------------------</xsl:text> 
</xsl:if> 

тестирования коды: http://xsltransform.net/pPzifpU

*) вы можете также иметь возможность сравнить элемент непосредственно в последнем предикате, что-то вроде: [preceding-sibling::footnote[1]=current()]

+0

Эй Это работало потрясающе, но не могли бы вы сообщить мне, где я ошибаюсь в своем оригинальном посте. – user3872094

+0

@ user3872094 Разве я не упоминал о * "' ./@ label' в конце вашего исходного выражения 'test' * * :) – har07

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