XSLT: Eine Sequenz von mehr als einem Element ist nicht erlaubt, da das erste argument an concat()
Ich versuche zu generieren, die eine pagelist, die aus einer Verkettung der id der verschiedenen divs (@Kapitel)|(@). Mein problem ergibt sich aus geschachtelten Strukturen: @Teil kann eine beliebige Anzahl von @Kapitel. Ich will nur wählen Sie die id des letzten Vorfahren auf eine Seitenzahl im Dokument um.
Unten ist ein Ausschnitt aus der XML:
<text>
<div class="part" id="s9781483352947.i870">
<a class="page" id="pbr-31"/>
<h1 class="title">Part 1</h1>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<div class="chapter" id="s9781483352947.n3.i884">
<a class="page" id="pbr-34"/>
<h1 class="title">Chapter 1</h1>
<p>This is a paragraph</p>
</div>
</div>
</text>
Und unten ist mein XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<xsl:element name="nav">
<xsl:element name="h1">
<xsl:value-of select="'Pages'"/>
</xsl:element>
<xsl:element name="ol">
<xsl:apply-templates mode="pagelist" select="//a[@class='page']"/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="a[@class='page']" mode="pagelist">
<xsl:variable name="html" select="concat(ancestor::div[@class='chapter'][1]/@id | ancestor::div[@class='part'][1]/@id,'.xhtml#page')"/>
<xsl:variable name="pagenumber" select="substring-after(@id,'-')"/>
<xsl:element name="li">
<xsl:element name="a">
<xsl:attribute name="href" select="concat($html,$pagenumber)"/>
<xsl:value-of select="substring-after(@id,'-')"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Jedoch, bekomme ich immer die Fehlermeldung: Eine Sequenz von mehr als einem Element ist nicht erlaubt, da das erste argument an concat(). Natürlich sind meine XPath-Auswahl mehrerer Zeichenfolgen im ersten argument aufgrund der @ - Teil und @Kapiteln. Wie kann ich die Auswahl eingrenzen und der erste Vorfahr des a class='Seite'?
Dies ist die gewünschte Ausgabe für das obige Beispiel:
<nav>
<h1>Pages</h1>
<ol>
<li>
<a href="s9781483352947.i870.xhtml#page31">31</a>
</li>
<li>
<a href="s9781483352947.n3.i884.xhtml#page34">34</a>
</li>
</ol>
</nav>
InformationsquelleAutor user2093335 | 2013-12-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst das pipe-symbol in Xpath, nicht die "oder" Sie denken. Was es tut, es kombiniert zwei separate Abfragen und gibt diese als ein Knoten-set. Also, was geschieht, jede Ihrer Fragen für Kapitel und Teile ist die Rückkehr ein element (das @id-Attribut des ersten Knotens), und dann die Kombination der Rückkehr ein node-set mit zwei Knoten. Also warum
concat
Probleme.Könnten Sie tun:
, Aber es wäre falsch!! Da dies die ersten in der kombinierten Serie, aber es wird nicht führen Sie Sie in das richtige Dokument, um. So würde es immer bekommen ein Kapitel, wenn verfügbar, bevor man ein Teil ist.
Was Sie stattdessen brauchen, ist dies:
Ich bin mir nicht sicher, warum Sie mit
concat
auf etwas, das Sie schonconcat
ed. Als beiseite, wenn Sieconcat
ing mit einem string und machen ein Attribut, Sie können umgeben Sie es in geschweifte Klammern zu machen, die XSLT kürzer, wie in der unten:edit: Wenn Sie wollten weiterhin mit
xsl:attribute
Elemente, die Sie verwenden könnten, concat, wie in der folgenden Vorlage:Seine ein wenig Ausführlicher, das ist der Grund, warum ich lieber inline-Attribut-Werte.
Keine Sorge. Aber was ist nicht legal Xpath-jetzt?
Wenn ich sage: <xsl:element name="a"> <xsl:attribute name="href" select="{$html}xhtml#Seite{$pagenumber}"/> <xsl:value-of select="$pagenumber"/> </xsl:element> --bekomme ich eine Fehlermeldung xsl:Attribut auswählen
Oh, ja Sie können verwenden Sie nur
{curly braces}
bei der Herstellung inline-Attribute, wie das, was ich getan habe. Werde ich hinzufügen, eine Antwort, wie es zu tun mit regelmäßigenxsl:attribute
s.Gotcha. Danke!
InformationsquelleAutor
Ich würde vorschlagen, dass Sie die Berechnung der Variablen
html
zuDurch das verschieben der überprüfung der gültigen
class
in den Klammern, die Sie nie mehr, dass ein Knoten aus, die Vorfahren XPath-Ausdruck.InformationsquelleAutor Marcus Rickert