Auf dieser Seite: Erfahren Sie mehr über die Handlebars- und PQL-Personalisierungssyntax in Adobe Journey Optimizer, einschließlich allgemeiner Regeln, reservierter Keywords, Typzwang, verfügbarer Namespaces und Best Practices.
Personalization in Journey Optimizer verwendet zwei komplementäre Syntaxen, die im selben Ausdruck zusammenarbeiten:
- Handlebars (
{{...}}) - Wird zum Rendern von Profilattributen, zum Durchlaufen von Arrays und zum Aufrufen von Block-Helfern verwendet. Eine vollständige Referenz finden in der zu HandlebarsJS . - Profile Query Language (PQL) (
{%= ... %}) - Wird zum Aufrufen integrierter Funktionen (z. B.upperCase(),formatDate(),dateDiff()) und zum Auswerten bedingter Ausdrücke verwendet.
Um Laufzeitfehler zu vermeiden, ist es von entscheidender Bedeutung zu verstehen, in welchem Kontext Sie sich befinden. Beispielsweise schlägt ein in {{...}} platzierter PQL-Funktionsaufruf fehl, weil Handlebars versucht, ihn als Helper aufzulösen, anstatt ihn als PQL-Ausdruck zu bewerten.
Beispiele:
{{profile.person.name.firstName}}{%= upperCase(profile.person.name.firstName) %}{%#if profile.loyalty.tier = "gold"%}...{%/if%}{{#each profile.orders}}...{{/each}}Die Attributstruktur wird in einem XDM-Schema von Adobe Experience Platform definiert. Weitere Informationen.
Allgemeine Syntaxregeln general-rules
-
Kennungen können beliebige Unicode-Zeichen sein, mit Ausnahme der folgenden Sonderzeichen, die für die Handlebars-Syntax reserviert sind:
code language-none Whitespace ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~ -
Die Syntax unterscheidet zwischen Groß- und Kleinschreibung.
-
Die Wörter true, false, null und undefined sind nur im ersten Teil eines Pfadausdrucks zulässig.
-
In Handlebars werden den von {{expression}} zurückgegebenen Werten HTML-Escape-Zeichen hinzugefügt. Wenn der Ausdruck „
&“ enthält, wird die Ausgabe mit HTML-Escape-Zeichen als „&“ generiert. Wenn Sie wünschen, dass Handlebars einen Wert nicht escapen, verwenden Sie drei geschweifte Klammern.Angenommen, der Wert des Felds
profile.person.namelautet „Mark & Mary“. Die Syntax{{profile.person.name}}zeigtMark & Maryan, während{{{profile.person.name}}}Mark & Maryanzeigt. -
Bezüglich der Argumente für Literalfunktionen unterstützt der Sprach-Parser für Vorlagen keinen einfachen umgekehrten Schrägstrich ohne Escape-Sequenz (
\). Dieses Zeichen muss mit einem zusätzlichen umgekehrten Schrägstrich (\) mit Escape-Sequenz versehen werden. Beispiel:{%= regexGroup("abc@xyz.com","@(\\w+)", 1)%} -
Um ein literales doppeltes Anführungszeichen in einen Zeichenfolgenwert einzuschließen (z. B. beim Generieren einer JSON-Ausgabe), Escape-Zeichen mit einem umgekehrten Schrägstrich (
\"):code language-handlebars { "message": "Hello \"{{profile.person.name.firstName}}\"" }Ausgabe:
{ "message": "Hello \"John\"" }Alternativ können Sie die Triple-Stash-
{{{ }}}verwenden, um HTML ohne Escape-Zeichen auszugeben, wenn der Wert selbst Sonderzeichen enthält, die nicht in HTML codiert werden sollen.
Reservierte Keywords reserved-keywords
Bestimmte Keywords sind in Profile Query Language (PQL) reserviert und können nicht direkt als Feld- oder Variablennamen in Personalisierungsausdrücken verwendet werden. Wenn Ihr XDM-Schema Felder mit Namen enthält, die reservierten Keywords entsprechen, müssen Sie diese mit Backticks (`) maskieren, wenn Sie in Ihren Ausdrücken darauf verweisen möchten.
Zu den reservierten Keywords zählen:
nextlastthis
Beispiel:
Wenn Ihr Profilschema ein Feld mit dem Namen next enthält, müssen Sie es in Backticks einschließen:
{{profile.person.`next`.name}}
Ohne die Backticks gibt die Validierung des Personalisierungseditors einen Fehler zurück.
{{...}} Handlebars-Pfade als auch für {%= ... %} PQL-Ausdrücke, da diese Keywords auf der Pfadauflösungsebene reserviert sind. Dies unterscheidet sich von den Feldnamen mit Bindestrich, bei denen Backtick-Escaping nur innerhalb von PQL-Ausdrücken unterstützt wird. Siehe Schlüssel für getrennte Attribute.PQL-Syntaxregeln für spezielle Attributschlüssel pql-special-keys
Neben reservierten Keywords erfordern zwei zusätzliche Fälle Backtick-Escaping in PQL-Ausdrücken.
Getrennte Attributschlüssel hyphenated-keys
Wenn Ihr XDM-Schema Feldnamen mit Bindestrichen (z. B. my-field, event-type) oder Namen enthält, die mit Zahlen beginnen oder Zahlen enthalten, schließen Sie den Schlüssel in Backticks in PQL-Ausdrücken ein:
{%= profile.events.`order-total` > 100 %}
{%= ... %}) unterstützt. Sie wird in der Handlebars-Interpolation ({{...}}) nicht unterstützt. Trennzeichen können jedoch direkt in {{...}} referenziert werden (z. B. {{profile.my-custom-field}}); nur die Backtick-Syntax schlägt dort fehl.Ohne Backticks in einem PQL-Ausdruck wird der Bindestrich als Subtraktionsoperator interpretiert und verursacht einen PQL-Syntaxfehler.
Numerische Ereignis-IDs in Kontextattributen numeric-event-ids
Wenn Sie auf Kontextereignisattribute verweisen, bei denen die Ereignis-ID eine Zahl ist (z. B. 1697323153), schließen Sie sie in Backticks ein. Dies gilt auch für Funktionen wie formatDate():
Typzwang type-coercion
PQL ist stark typisiert. Beim Vergleichen oder Übergeben von Werten müssen beide Seiten vom gleichen Typ sein. Häufige Fälle:
stringToNumber() vor Arithmetik oder Vergleich verwenden: {%= stringToNumber(profile.loyalty.pointsBalance) > 500 %}string_to_integer() oder stringToNumber() vor der Arithmetik verwendentoBool() zum Konvertieren verwenden: {%= toBool(profile.consents.email.val) = true %}Verfügbare Namespaces namespaces
-
Profil
Dieser Namespace erlaubt die Referenzierung aller im Profilschema definierten Attribute, die unter Dokumentation zum Datenmodell (XDM) von Adobe Experience Platform beschrieben werden.
Die Attribute müssen im Schema definiert sein, damit sie in einem Personalisierungsblock in Journey Optimizer referenziert werden können.
Weitere Informationen zur Verwendung von Profilattributen in Bedingungen finden Sie in diesem Abschnitt.
accordion Beispielverweise {{profile.person.name.fullName}}{{profile.person.name.firstName}}{{profile.person.gender}}{{profile.personalEmail.address}}{{profile.mobilePhone.number}}{{profile.homeAddress.city}}{{profile.faxPhone.number}}
-
Zielgruppe
Weitere Informationen zum Segmentierungs-Service finden Sie in dieser Dokumentation.
-
Angebote
In diesem Namespace können Sie bestehende Entscheidungen referenzieren.
Um ein Angebot zu referenzieren, müssen Sie einen Pfad mit den verschiedenen Informationen angeben, die das Angebot definieren. Dieser Pfad weist die folgende Struktur auf:
offers.Type.[Placement Id].[Activity Id].AttributeHier gilt:
offersidentifiziert den Pfadausdruck, der zum Angebots-Namespace gehört.Typebestimmt den Typ der Angebotsdarstellung. Zu den möglichen Werten gehörenimage,htmlundtextPlacement IdundActivity Idsind Platzierungs- und Aktivitätskennungen.Attributessind angebotsspezifische Attribute, die vom Angebotstyp abhängen. Beispiel:deliveryUrlfür Bilder
Weitere Informationen zur Entscheidungs-API und zu Angebotsdarstellungen finden Sie auf dieser Seite.
Ein Validierungsmechanismus, der auf dieser Seite beschrieben wird, validiert alle Verweise anhand des Angebotsschemas.
accordion Beispielverweise -
Speicherort, an dem das Bild gehostet wird:
offers.image.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].deliveryUrl -
Ziel-URL beim Klicken auf das Bild:
offers.image.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].linkUrl -
Text-Inhalt des Angebots aus der Entscheidungs-Engine:
offers.text.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].content -
HTML-Inhalt des Angebots aus der Entscheidungs-Engine:
offers.html.[offers:xcore:offer-placement:126f767d74b0da80].[xcore:offer-activity:125e2c6889798fd9].content
Helper helpers-all
Ein Handlebars-Helper ist eine einfache Kennung, auf die Parameter folgen können. Jeder Parameter ist ein Handlebars-Ausdruck. Helper können in jedem Kontext einer Vorlage aufgerufen werden.
Diese Block-Helper werden durch ein # am Anfang des Helper-Namens gekennzeichnet und erfordern einen passenden schließenden / am Ende des Namens.
Blöcke sind Ausdrücke mit einer Blockeröffnung ({{# }}) und schließendem ({{/}}).
Weitere Informationen zu Hilfsfunktionen finden Sie diesem Abschnitt.
Literaltypen literal-types
Adobe Journey Optimizer unterstützt die folgenden Literaltypen:
Beispiele:
"prospect", "jobs", "articles"Beispiele:
-201, 0, 412Hinweis: Sie können nicht direkt auf die Eigenschaften von Elementen in einem Array zugreifen.
Beispiele:
[1, 4, 7], ["US", "FR"]Best Practices best-practices
Überprüfen Sie diese Syntaxregeln, bevor Sie Personalisierungsausdrücke erstellen. Die meisten Laufzeitfehler rühren aus der Vermischung von Handlebars- und PQL-Kontexten her.
Verwenden Sie die richtige Syntax für bedingte Blöcke
Verwenden Sie immer {%#if%} / {%else if%} / {%else%} / {%/if%}. Die Syntax {% if %} / {% elseif %} / {% endif %} wird nicht unterstützt.
Rufen Sie keine PQL-Funktionen in {{...}} Handlebars-Blöcken auf
{{...}} löst nur Handlebars-Variablen und -Helfer auf - es wird PQL nicht ausgewertet. Das Umschließen einer PQL-Funktion wie upperCase() in {{...}} verursacht den Fehler „Helper konnte nicht gefunden werden“. Verwenden Sie stattdessen {%= ... %}:
{{upperCase(cleanName)}}{%= upperCase(cleanName) %}Verwenden eines Alias für eine benannte Schleife beim Kombinieren von {{#each}} mit{%#if%}
this.field wird vom Handlebars-Renderer aufgelöst, nicht jedoch vom PQL-Auswerter innerhalb einer {%#if%}. Definieren Sie einen benannten Alias mit as |item|, damit beide Kontexte das Feld auflösen können:
Weisen Sie einer Variablen vor der Schleife Ergebnisse der PQL-Funktion zu
PQL-UDFs wie topN können nicht direkt in {{#each}} aufgerufen werden. Bewerten Sie sie zunächst mit {% let %} und durchlaufen Sie dann das Ergebnis:
Verwenden Sie {% let %}, um zu vermeiden, dass Funktionsaufrufe wiederholt werden
Wenn ein berechneter Wert mehrmals benötigt wird, speichern Sie ihn in einer Variablen. Dies verbessert die Lesbarkeit und verhindert redundante Auswertungen:
Verwenden Sie die richtige Argumentreihenfolge fürdateDiff
dateDiff(start, end) nimmt das frühere Datum zuerst. Um die bis zu einem zukünftigen Datum verbleibenden Tage zu berechnen, übergeben Sie das aktuelle Datum als erstes Argument:
Verwenden von = für Gleichheitsvergleiche in PQL, nicht==
PQL verwendet für Gleichheit einen einzelnen =. Die Verwendung von == führt zu einem Syntaxfehler.
Backticks für Feldnamen mit Bindestrichen verwenden - nur in PQL-Ausdrücken
Wenn ein XDM-Schemafeldname einen Bindestrich enthält (z. B. order-total), schließen Sie ihn in Backticks ein, um zu verhindern, dass der Bindestrich als Subtraktionsoperator geparst wird. Dies wird nur innerhalb {%= ... %} PQL-Ausdrücke unterstützt, nicht in {{...}} Handlebars-Blöcken:
{%= profile.events.`order-total` > 100 %}
Gebrauchsfertige Ausdrücke, die Sie direkt in Ihren Inhalt kopieren können, finden Sie unter Personalization-Rezepte.
Kurzübersicht quick-reference
Dieser Abschnitt enthält strukturiertes Wissen zur Unterstützung von Interpretation, Abrufen und Antworten auf Fragen zu diesem Thema.
Zum vollständigen Verständnis sollten diese Informationen mit der Dokumentation auf dieser Seite kombiniert werden. Keine der beiden Quellen ist für Einzelpersonen gedacht. Die Seite beschreibt die Funktion, während dieser Abschnitt zusätzlichen Kontext bietet, der dabei hilft, Begriffe, Absichten, Anwendbarkeit und Begrenzungen zu unterscheiden.
TL;DR
Auf dieser Seite werden die Handlebars- und PQL-Personalisierungssyntaxen in Journey Optimizer erläutert - die allgemeinen Regeln, reservierten Schlüsselwörter, die Namespace-Struktur, das Typsystem und die Best Practices zur Vermeidung gängiger Laufzeitfehler.
Intents
- Verstehen, wann Handlebars (
{{...}}) und PQL ({%= ... %}) verwendet werden sollten - Anwenden allgemeiner Syntaxregeln: reservierte Zeichen, Groß-/Kleinschreibung, HTML-Escaping, umgekehrte Schrägstriche
- Reservierte Keywords und spezielle Attributschlüssel mit Escape-Zeichen (getrennte Namen, numerische Ereignis-IDs) korrekt darstellen
- Anwenden von Typzwang beim Vergleichen oder Übergeben von Werten nicht übereinstimmender Typen
- Referenzpersonalisierung aus den verfügbaren Namespaces: Profil, Zielgruppe, Angebote
- Befolgen Sie die Best Practices, um die häufigsten Laufzeitfehler und Validierungsfehler zu vermeiden
- Handlebars: Die
{{...}}Vorlagensyntax, die zum Rendern von Attributen, zum Durchlaufen von Arrays und zum Aufrufen von Block-Helfern verwendet wird. Die Ausgabe in HTML wird standardmäßig mit Escapezeichen versehen. (produktspezifisch) - Profile Query Language (PQL): Die
{%= ... %}Ausdruckssyntax, die zum Aufrufen integrierter Funktionen (z. B.upperCase(),formatDate()) und zum Auswerten bedingter Ausdrücke verwendet wird. (produktspezifisch) - Triple-Stash (
{{{ }}}): Eine Handlebars-Syntaxvariante, die Werte ohne HTML-Escape-Zeichen ausgibt. Dies ist nützlich, wenn der Wert selbst HTML-Zeichen enthält, die nicht codiert werden sollten. - Reservierte Schlüsselwörter: PQL-Kennungen (
next,last,this), die nicht direkt als Feld- oder Variablennamen verwendet werden können; müssen in Backticks eingeschlossen werden, wenn ein Schemafeld einen dieser Namen verwendet. - Typzwang Die explizite Konvertierung eines Werts von einem Datentyp in einen anderen (z. B. Zeichenfolge → Zahl) mithilfe von Funktionen wie
stringToNumber()odertoBool(), die vor dem Vergleich oder der Arithmetik in PQL erforderlich sind. - Namespace: Die Gruppierung der Personalisierungsdaten auf oberster Ebene - Profil, Zielgruppe, Angebote - jeweils mit eigener Pfadstruktur und eigenen Zugriffsregeln.
- Block helper: Ein Handlebars-Helper, der durch
#vor dem Helper-Namen und einem entsprechenden schließenden/identifiziert wird und für Blockkonstrukte wie{{#each}}verwendet wird.
- Kanonischer Name: Handlebars — für die
{{...}}Syntax; PQL — für die{%= ... %} - Verwechseln Sie nicht:
{{...}}(Handlebars — rendert Variablen und Helper, mit HTML-Escape-Zeichen versehen) ≠{%= ... %}(PQL — wertet Funktionen und Ausdrücke aus) ≠{%#if%}/{%/if%}(bedingte Blocksyntax, geschweifte Klammern mit Prozentzeichen) - Verwechseln Sie nicht:
{{profile.person.name}}(Single-Stash — Ausgabe mit HTML-Escape-Zeichen) ≠{{{profile.person.name}}}(Triple-Stash — Ausgabe ohne Escape-Zeichen) - Verwechseln Sie nicht: reservierte Backtick-Maskierung für Keywords (gilt für
{{...}}und{%= ... %}) ≠ Backtick-Maskierung für Bindestriche (wird nur innerhalb{%= ... %}PQL-Ausdrücke unterstützt, nicht in{{...}}) - Verwechseln Sie nicht:
=(PQL-Gleichheitsoperator — korrekt) ≠==(ungültiger PQL — verursacht einen Syntaxfehler)
- Die Variable
xEventist in Personalisierungsausdrücken nicht verfügbar. Jeder Verweis aufxEventführt zu Validierungsfehlern. - PQL-Funktionsaufrufe innerhalb
{{...}}Handlebars-Blöcke schlagen fehl. Verwenden Sie stattdessen{%= ... %}. - Die bedingte Syntax
{% if %}/{% elseif %}/{% endif %}wird nicht unterstützt. Verwenden Sie{%#if%}/{%else if%}/{%/if%}. - Backtick-Escaping für getrennte Feldnamen wird nur innerhalb von PQL-Ausdrücken (
{%= ... %}) unterstützt. In{{...}}Handlebars-Interpolation schlägt die Backtick-Syntax fehl - aber auf mit Bindestrichen versehene Feldnamen kann weiterhin direkt verwiesen werden (z. B.{{profile.my-custom-field}}). - Reservierte Schlüsselwörter (
next,last,this) müssen in Backticks eingeschlossen werden, wenn sie als Schemafeldnamen verwendet werden. Gilt für{{...}}und{%= ... %}. - Ein einfacher umgekehrter Schrägstrich
\wird nicht als literales Funktionsargument unterstützt. Verwenden Sie einen doppelten umgekehrten Schrägstrich\\. - PQL ist stark typisiert. Nicht übereinstimmende Typen in Vergleichen oder Arithmetik erfordern eine explizite Konvertierung mithilfe von
stringToNumber(),toBool()oder ähnlichen Zwangsfunktionen.
F: Wann sollte ich {{...}} vs. {%= ... %} verwenden?
Verwenden Sie {{...}} (Handlebars), um Attributwerte zu rendern, Arrays zu durchlaufen und Block-Helper aufzurufen. Verwenden Sie {%= ... %} (PQL), um integrierte Funktionen wie upperCase() und formatDate() aufzurufen und bedingte Ausdrücke auszuwerten.
F: Wie gebe ich einen Wert ohne HTML-Codierung aus?
Verwenden Sie die Triple-Stash-{{{ }}} anstelle von {{...}}. Handlebars mit einer Klammer HTML-Escapes-Ausgabe (z. B. wird & zu &); Triple-Stash-Bypässe mit Escaping.
F: Was ist der richtige Gleichheitsoperator in PQL?
Verwenden Sie einen einzigen = für Gleichheitsvergleiche in PQL. Die Verwendung von == ist ein Syntaxfehler.
F: Wie verweise ich auf ein Schemafeld, dessen Name ein reserviertes Schlüsselwort ist (z. B. next, last, this)?
Binden Sie ihn in Backticks ein: {{profile.person.\next`.name}`. Dies gilt sowohl für Handlebars-Pfade als auch für PQL-Ausdrücke.
F: Kann ich PQL-Funktionen in {{...}} Handlebars-Blöcken aufrufen?
Nein. {{...}} löst nur Handlebars-Variablen und -Helfer auf. Eine PQL-Funktion in {{...}} verursacht den Fehler „Helper konnte nicht gefunden werden“. Verwenden Sie stattdessen {%= functionName(...) %} .