Wiederholung von Absätzen – Leitfaden für Foreach-Schleifen
Dokumente enthalten häufig wiederkehrende Inhaltsstrukturen wie Listen von Elementen, mehrere Datensätze oder wiederholte Abschnitte mit ähnlicher Formatierung. PDF4meDie Template-Engine von bietet leistungsstarke Iterationsfunktionen, um dynamisch mehrere Absätze und Abschnitte aus Datensammlungen zu generieren.
Foreach-Schleifen verstehen
Der foreach Die Schleife ist der primäre Mechanismus, um Datensammlungen zu durchlaufen und wiederkehrende Inhalte zu generieren. In jeder Iteration wird ein Element der Sammlung verarbeitet und die entsprechende Ausgabe erzeugt.
Grundlegende Foreach-Syntax
<<foreach [item in collection]>>
Content with <<[item.property]>>
<</foreach>>
Komponenten:
item- Variable, die das aktuelle Element in der Iteration darstelltcollection- Das Datenarray oder die Datensammlung, die durchlaufen werden soll- Inhaltsblock – Vorlageninhalt, der für jedes Element wiederholt wird
Wiederkehrende Absätze
Generieren Sie mehrere Absätze, indem Sie eine Datensammlung durchlaufen und für jedes Element formatierten Text erstellen.
Beispiel: Anwendungsbewertungen
Vorlagensyntax:
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
Datenquelle (JSON):
{
"surveyName": "Top-rated Apps",
"applications": [
{
"listAppName": "Instagram",
"listAppType": "iOS",
"category": "Social Media",
"AppRating": "4.9"
},
{
"listAppName": "Whatsapp",
"listAppType": "iOS",
"category": "Chat",
"AppRating": "4.8"
},
{
"listAppName": "Player UG",
"listAppType": "Android",
"category": "Gaming",
"AppRating": "4.75"
}
]
}
Generierte Ausgabe:
Instagram in iOS platform is a Social Media app and has a 4.9 rating.
Whatsapp in iOS platform is a Chat app and has a 4.8 rating.
Player UG in Android platform is a Gaming app and has a 4.75 rating.
Umgang mit leeren Sammlungen
Wenn eine Sammlung leer sein könnte, verwenden Sie die Any() Methode zur Überprüfung der Daten vor der Iteration. Dies verhindert Null-Ausnahmen und ermöglicht die Anzeige alternativer Inhalte.
Grundlegende Nullprüfung
Vorlage mit Any()-Prüfung:
<<if [applications.Any()]>>
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
<<else>>No applications listed
<</if>>
Dieser Ansatz:
- Prüft, ob die Sammlung Elemente enthält.
- Durchläuft die Elemente, falls verfügbar
- Zeigt eine Ausweichmeldung an, falls die Sammlung leer ist.
Verschachtelte Foreach-Schleifen
Erstellen Sie hierarchische Strukturen, indem Sie foreach-Schleifen ineinander verschachteln. Dies ist nützlich, um Eltern-Kind-Beziehungen oder mehrstufige Datenstrukturen darzustellen.
Beispiel: Abteilung und Mitarbeiter
Vorlage:
<<foreach [dept in departments]>>
Department: <<[dept.name]>>
<<foreach [emp in dept.employees]>>
- <<[emp.name]>> (<<[emp.position]>>)
<</foreach>>
<</foreach>>
Daten:
{
"departments": [
{
"name": "Engineering",
"employees": [
{ "name": "John Smith", "position": "Senior Developer" },
{ "name": "Jane Doe", "position": "Tech Lead" }
]
},
{
"name": "Marketing",
"employees": [
{ "name": "Mike Johnson", "position": "Marketing Manager" }
]
}
]
}
Wiederholende komplexe Abschnitte
Foreach-Schleifen können ganze Inhaltsabschnitte wiederholen, einschließlich mehrerer Absätze, Formatierungen und verschachtelter Strukturen.
Wiederholungen über mehrere Absätze
Vorlage:
<<foreach [product in products]>>
Product Name: <<[product.name]>>
Description: <<[product.description]>>
Price: $<<[product.price]>>
Available: <<[product.inStock]>>
<</foreach>>
Diese Vorlage generiert für jedes Produkt einen vollständigen Produktbeschreibungsblock, wobei alle Formatierungen und Absatzumbrüche erhalten bleiben.
Bedingte Iteration
Kombinieren Sie foreach-Schleifen mit bedingten Anweisungen zur selektiven Inhaltsgenerierung.
Beispiel: Bedingte Anzeige
Vorlage:
<<foreach [employee in employees]>>
<<if [employee.age > 50]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</if>>
<</foreach>>
Alternativ können Sie Aufzählungsmethoden verwenden:
Vorlage:
<<foreach [employee in employees.Where(e => e.age > 50)]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</foreach>>
Formatierung innerhalb von Schleifen
Wenden Sie Formatierungen auf Felder innerhalb von foreach-Schleifen an, um eine einheitliche Ausgabedarstellung zu gewährleisten.
Vorlage:
<<foreach [customer in customers]>>
Customer: <<[customer.name]:caps>>
Last Visit: <<[customer.lastVisit]:"MMMM dd, yyyy">>
Status: <<[customer.status]:upper>>
<</foreach>>
Schleifenvariablen und Indizierung
Informationen zur Schleifenposition können mithilfe impliziter Variablen abgerufen werden (sofern dies von Ihrer Template-Engine-Version unterstützt wird).
Gemeinsame Schleifenvariablen
- Aktueller Artikelindex (0-basiert oder 1-basiert, je nach Implementierung)
- Schleifeniterationsanzahl
- Indikatoren für erstes/letztes Element
Beispielhafte Verwendung (sofern unterstützt):
<<foreach [item in items]>>
<<[$index + 1]>>. <<[item.name]>>
<</foreach>>
Leistungsüberlegungen
Bewährte Verfahren für Schleifen
- Maximale Sammlungsgröße - Große Sammlungen vor der Vorlagenverarbeitung filtern.
- Vermeiden Sie tiefe Nester - Beschränken Sie verschachtelte Schleifen auf 2-3 Ebenen, um eine bessere Leistung zu erzielen.
- Daten vorverarbeiten - Führe komplexe Berechnungen durch, bevor du Daten an Vorlagen übergibst.
- Nutzen Sie effiziente Abfragen - Daten auf Datenquellenebene filtern und sortieren
Beispiel: Vorgefilterte Daten
Anstatt:
<<foreach [emp in employees.Where(e => e.age > 30).OrderBy(e => e.name)]>>
Filtern Sie die Daten in Ihrer Anwendung vor und leiten Sie die gefilterten Daten weiter:
<<foreach [emp in filteredEmployees]>>
Gemeinsame Muster
Muster 1: Nummerierte Liste
<<foreach [item in items]>>
<<[$index]>>. <<[item.title]>>
<</foreach>>
Muster 2: Gruppierter Inhalt
<<foreach [category in categories]>>
## <<[category.name]>>
<<foreach [item in category.items]>>
- <<[item.name]>>
<</foreach>>
<</foreach>>
Muster 3: Zusammenfassung
<<foreach [report in reports]>>
Report: <<[report.title]>>
Total Records: <<[report.records.Count()]>>
Average Value: <<[report.records.Average(r => r.value)]>>
<</foreach>>
Fehlerbehebung
Häufige Probleme
Ausgabe: Nullreferenzfehler
Lösung: Verwenden Any() Sammlungen vor der Iteration prüfen
Ausgabe: Unerwünschte Zeilenumbrüche oder Leerzeichen Lösung: Achten Sie sorgfältig auf den Leerraum in Ihrer Vorlage.
Ausgabe: Leistungsprobleme bei großen Datenmengen Lösung: Daten vorfiltern und Sammlungsgrößen begrenzen
Ausgabe: Fehlerhafte Datenbindung ... Lösung: Überprüfen Sie, ob die Eigenschaftsnamen exakt mit Ihrer Datenstruktur übereinstimmen.
Praxisbeispiel: Rechnungspositionen
Vollständige Vorlage:
Invoice #<<[invoiceNumber]>>
Date: <<[invoiceDate]:"dd.MM.yyyy">>
Items:
<<if [lineItems.Any()]>>
<<foreach [item in lineItems]>>
<<[item.name]:caps>> - Qty: <<[item.quantity]>> - Price: $<<[item.price]:"F2">> - Total: $<<[item.quantity * item.price]:"F2">>
<</foreach>>
Subtotal: $<<[lineItems.Sum(i => i.quantity * i.price)]:"F2">>
<<else>>
No items in this invoice.
<</if>>
:::Tipp Komplexe Iterationen Bei komplexen Iterationsszenarien empfiehlt es sich, die Daten in der Anwendungslogik vorzuverarbeiten, bevor sie an die Vorlage übergeben werden. Dies verbessert die Lesbarkeit und Leistung der Vorlage.
:::