2016-02-04 143 views
0

我正在寫的模板,其中,如果存在包含footnote和沒有另一個footnote在這兩個(the processing instructioncurrent footnote)之間我需要添加一個線後main的處理指令。匹配前一元素文本包含

下面是我的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> 

的條件是這樣。有一個footnotefollowing它有處理指令,它們有2種類型。 <?xpp MAIN;2;0;0;0;45;0;0?><?xpp foot;art10_ft7;suppress?>。在這裏我的查詢是我需要匹配following processing instructioncontainingMAIN,並且current footnoteprocessing instruction之間不應該有其他footnote,並且如果條件匹配,我需要畫一條線。

我正在使用以下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在這裏,因爲事關所有的元素都是在內部的同一水平相同的父元素。然後,在原始test表達式的末尾有一個錯誤./@label。上下文有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

相關問題