2016-09-01 4 views
0

bekomme Ich schreibe ein XSL und unten ist meine Anforderung.kann nicht wissen, wie man den Wert von Baum

  1. Wann immer ich auf ein superscript kommen, die gesamten XML-Suche und eine listitem mit dem Attribute override und hte Wert sehen soll die superscript gleich sein.
  2. wenn es gefunden wird anwenden Vorlagen auf demselben

Unten ist mein XML

<?xml version="1.0" encoding="UTF-8"?> 
<division> 
<superscript>1</superscript> 
<page num="1"/> 
     <note role="para-footnote"> 
      <orderedlist> 
      <listitem override="1"> 
         <para>Hi</para> 
      </listitem> 
      </orderedlist> 
     </note>  
</division> 

Und hier ist mein XSL

<xsl:template match="superscript[name(ancestor::*[last()]) = 'division']"> 
     <xsl:apply-templates select="//listitem[@override=.]/preceding::page[1]" mode="first"/> 
     <xsl:variable name="cnt" select="count(preceding::superscript)+1"/> 
     <xsl:variable name="varHeaderNote" select='concat("f",$cnt)'/> 
     <xsl:variable name="varFootNote" select='concat("#ftn.",$cnt)'/> 
     <sup> 
      <a name="{$varHeaderNote}" href="{$varFootNote}" class="tr_ftn"> 
       <xsl:value-of select="."/> 
      </a> 
     </sup> 
    </xsl:template> 
     <xsl:template match="page" mode="first"> 
     <xsl:variable name="pb" select="./@num"/> 
     <xsl:processing-instruction name="pb"> 
      <xsl:text>label='</xsl:text> 
      <xsl:value-of select="$pb"/> 
      <xsl:text>'</xsl:text> 
      <xsl:text>?</xsl:text> 
     </xsl:processing-instruction> 
     <a name="{concat('pg_',$pb)}"/> 
    </xsl:template> 

mein aktuelles O/p

<!DOCTYPE html 
    PUBLIC "XSLT-compat"> 
<hmtl> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>New Version!</title> 
    </head> 
    <sup><a name="f1" href="#ftn.1" class="tr_ftn">1</a></sup> 
    <page num="1"></page> 
    <note role="para-footnote"> 
     <orderedlist> 
     <listitem override="1"> 
      <para>Hi</para> 
     </listitem> 
     </orderedlist> 
    </note>  
</hmtl> 

Erwartete O/p:

<!DOCTYPE html 
    PUBLIC "XSLT-compat"> 
<hmtl> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>New Version!</title> 
    </head> 
<?pb label='1'?> 
    <sup><a name="f1" href="#ftn.1" class="tr_ftn">1</a></sup> 
    <page num="1"></page> 
    <note role="para-footnote"> 
     <orderedlist> 
     <listitem override="1"> 
      <para>Hi</para> 
     </listitem> 
     </orderedlist> 
    </note>  
</hmtl> 

Hier ist eine Arbeits Geige. http://xsltransform.net/ejivdGR

Bitte lassen Sie mich wissen, wo ich falsch liege und wie ich das beheben kann.

Dank

Antwort

1

Vergleich @override = current() im Prädikat finden http://xsltransform.net/ejivdGR/1.

Oder besser ein Schlüssel <xsl:key name="li" match="listitem" use="@override"/> definieren und dann können Sie verwenden, um die key('li', .)listitem durch die superscript verwiesen zu finden.

+0

Hallo Freund, danke, das funktioniert genial :-), aber eine kleine Frage, ist nicht '.' gleich wie' current() '? – user3872094

+1

Innerhalb des Prädikats nicht, nein, mit '// listitem [@override =.]' Das '.' ist das' listitem', auf das Sie das Prädikat angewendet haben, so dass Sie im Grunde das '@ override' Attribut des' listitems vergleichen 'Element zum (Zeichenfolgenwert des) Listeneintrags selbst. 'current()' bezieht sich auf das aktuelle Kontextelement, wie in https://www.w3.org/TR/xslt20/#current-function definiert. –

Verwandte Themen