Ein reiner XPath 2.0 Ausdruck:
for $b in /*/book
return
concat(escape-html-uri(string-join(($b/@isbn,
$b/title,
$b/description
)
/normalize-space(),
",")
),
codepoints-to-string(10))
XSLT 2 - basierte Überprüfung:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select=
"for $b in /*/book
return
concat(escape-html-uri(string-join(($b/@isbn,
$b/title,
$b/description
)
/normalize-space(),
',')
),
codepoints-to-string(10))"/>
</xsl:template>
</xsl:stylesheet>
Wenn diese Transformation auf dem bereitgestellten XML Dokument angewandt wird (korrigierter von seinem Fehlbildung):
<books>
<book isbn="1590593049">
<title>Extending Flash MX 2004</title>
<description>
Using javascript alongwith actionscript 3.0 and mxml.</description>
</book>
<book isbn="0132149184">
<title>Java Software Solutions</title>
<description>
Complete book full of case studies on business solutions and design concepts while building mission critical
business applications.
</description>
</book>
</books>
das gewünschte, korrekte Ergebnis wird produziert:
1590593049,Extending Flash MX 2004,Using javascript alongwith actionscript 3.0 and mxml.
0132149184,Java Software Solutions,Complete book full of case studies on business solutions and design concepts while building mission critical business applications.
aktualisieren:
In einem Kommentar der OP fordert alle im Text durch ein Zitat und umgeben sein Komma (Danach wird jedes Zitat durch zwei Anführungszeichen ersetzt, und schließlich, wenn das Ergebnis von wholw ein Zitat enthält, muss es von (einzelnen) Anführungszeichen umgeben sein.
ist hier ein reiner Ausdruck XPath 2.0, die diese erzeugt: dagegen wird
for $b in /*/book,
$q in codepoints-to-string(34),
$NL in codepoints-to-string(10),
$isbn in normalize-space(replace($b/@isbn, ',', concat($q,',',$q))),
$t in normalize-space(replace($b/title, ',', concat($q,',',$q))),
$d in normalize-space(replace($b/description, ',', concat($q,',',$q))),
$res in
escape-html-uri(string-join(($isbn,$t,$d), ',')),
$res2 in replace($res, $q, concat($q,$q))
return
if(contains($res2, $q))
then concat($q, $res2, $q, $NL)
else concat($res2, $NL)
Wenn dieser XPath-Ausdruck XML-Dokument (mit einem neuen Testfall erweitert) ausgewertet:
<books>
<book isbn="1590593049">
<title>Extending Flash MX 2004</title>
<description>
Using javascript alongwith actionscript 3.0 and mxml.</description>
</book>
<book isbn="0132149184">
<title>Java Software Solutions</title>
<description>
Complete book full of case studies on business solutions and design concepts while building mission critical
business applications.
</description>
</book>
<book isbn="XX1234567">
<title>Quotes and comma</title>
<description>
Hello, World from "Ms-Excel"
</description>
</book>
</books>
das gewünschte, korrekte Ergebnis wird produziert:
1590593049,Extending Flash MX 2004,Using javascript alongwith actionscript 3.0 and mxml.
0132149184,Java Software Solutions,Complete book full of case studies on business solutions and design concepts while building mission critical business applications.
"XX1234567,Quotes and comma,Hello"","" World from ""Ms-Excel"""
aber wenn es reine XPath 2 wäre würde es nicht interpretieren die ' ' als Zeilenumbruch – BeniBela
@BeniBela, Ihre Frage ist nicht klar - Ich aktualisierte meine Antwort mit einem XSLT-Transformation, die den gleichen XPath-Ausdruck verwendet Wenn dies kein gültiger XPath-Ausdruck wäre, gäbe es einen Fehler, aber die Umwandlung funktioniert ohne Probleme –
Nun, wenn Sie es in XSLT aufnehmen, ist es nicht mehr * reiner * XPath. Dann ersetzt der XML-Parser das & # xA. Wenn Sie nur den * pure * XPath ohne XSLT ausführen, erhalten Sie: '1590593049, Flash MX 2004 erweitern, Javascript mit ActionScript 3.0 und MXML verwenden. 0132149184, Java Software-Lösungen, Komplettes Buch voller Fallstudien zu Business-Lösungen und Design-Konzepten beim Erstellen geschäftskritischer Geschäftsanwendungen. 'in dem Beispiel – BeniBela