匹配前面的元素文本包含

时间:2016-02-04 11:42:30

标签: xml xslt xpath

我正在编写一个模板,如果在main之后有一个包含footnote的处理指令,而在这两个之间没有另一个footnotethe processing instruction和{ {1}})我需要添加一行。

以下是我的XML。

current footnote

我正在尝试使用下面的XSLT。

<?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>

目前我得到的是以下输出。

<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<?xpp MAIN;2;0;0;0;45;0;0?>。在这里,我的查询是我需要匹配<?xpp foot;art10_ft7;suppress?> following processing instruction containingMAIN和{{1}之间不应该有其他footnote如果条件匹配,我需要画一条线。

我正在使用以下xpath来匹配条件。但这并没有像预期的那样发挥作用。

current footnote

请让我知道我该怎么做。

由于

1 个答案:

答案 0 :(得分: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()]