2011-10-21 6 views
5

Sto estraendo dati da XML utilizzando XSLT 2.0. I dati hanno linee lunghe e voglio adattarli alla dimensione della finestra interrompendo automaticamente le linee.Come inserire testo per adattarsi alla finestra in XSLT

E 'possibile in XSLT?

+1

Qual è il formato di destinazione (ad es. Xsl: metodo di output)? Se questo è HTML o XHTML, i browser si assicureranno che il contenuto non esca, quindi non penso che tu debba fare nulla. E naturalmente XSLT non sa nulla di Windows o di dimensioni della finestra, trasforma l'XML in testo o (X) HTML o altro XML. –

+0

@MartinHonnen Il mio output XML è testo e non XHTML. È possibile se lo faccio uscire in formato testo? – smandape

risposta

6

È possibile utilizzare la funzione XSLT 2.0 standard unparsed-text() per leggere un file di testo direttamente nel codice XSLT 2.0.

Poi basta utilizzare:

replace(concat(normalize-space($text),' '), 
       '(.{0,60}) ', 
       '$1
') 

Spiegazione:

Questa prima normalizza spazio bianco, eliminando la testa e di coda sequenze di spazi bianchi solo caratteri e sostituendo tale sequenza interno con un unico spazio.

Quindi il risultato della normalizzazione viene utilizzato come primo argomento della funzione standard XPath 2.0 replace().

Il pattern partita è qualunque (sequenza più lunga possibile di massimo 61 caratteri che termina con uno spazio.

argomento

La sostituzione specifica che tale sequenza trovato deve essere sostituito dalla stringa prima dello spazio termina, concatenato con un . carattere NL

Qui è una soluzione completa, la lettura e la formattazione il testo dal file C:\temp\delete\text.txt:

Dec. 13 — As always for a presidential inaugural, security and surveillance were 
extremely tight in Washington, DC, last January. But as George W. Bush prepared to 
take the oath of office, security planners installed an extra layer of protection: a 
prototype software system to detect a biological attack. The U.S. Department of 
Defense, together with regional health and emergency-planning agencies, distributed 
a special patient-query sheet to military clinics, civilian hospitals and even aid 
stations along the parade route and at the inaugural balls. Software quickly 
analyzed complaints of seven key symptoms — from rashes to sore throats — for 
patterns that might indicate the early stages of a bio-attack. There was a brief 
scare: the system noticed a surge in flulike symptoms at military clinics. 
Thankfully, tests confirmed it was just that — the flu. 

il codice XSLT:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:variable name="vText" select= 
"unparsed-text('file:///c:/temp/delete/text.txt')"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "replace(concat(normalize-space($vText),' '), 
      '(.{0,60}) ', 
      '$1&#xA;') 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

Il risultato è un insieme di righe, ciascuna delle quali non superi una lunghezza fissa di 60:

Dec. 13 — As always for a presidential inaugural, security 
and surveillance were extremely tight in Washington, DC, 
last January. But as George W. Bush prepared to take the 
oath of office, security planners installed an extra layer 
of protection: a prototype software system to detect a 
biological attack. The U.S. Department of Defense, together 
with regional health and emergency-planning agencies, 
distributed a special patient-query sheet to military 
clinics, civilian hospitals and even aid stations along the 
parade route and at the inaugural balls. Software quickly 
analyzed complaints of seven key symptoms — from rashes to 
sore throats — for patterns that might indicate the early 
stages of a bio-attack. There was a brief scare: the system 
noticed a surge in flulike symptoms at military clinics. 
Thankfully, tests confirmed it was just that — the flu. 

Aggiornamento:

In caso il testo proviene da un file XML, questo può essere fatto con una modifica minima della soluzione di cui sopra:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "replace(concat(normalize-space(text),' '), 
      '(.{0,60}) ', 
      '$1&#xA;') 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

Qui suppongo che tutto il testo è l'unico figlio nodo di testo dell'elemento superiore (denominata text) del documento XML:

<text> 
Dec. 13 — As always for a presidential inaugural, security and surveillance were 
extremely tight in Washington, DC, last January. But as George W. Bush prepared to 
take the oath of office, security planners installed an extra layer of protection: a 
prototype software system to detect a biological attack. The U.S. Department of 
Defense, together with regional health and emergency-planning agencies, distributed 
a special patient-query sheet to military clinics, civilian hospitals and even aid 
stations along the parade route and at the inaugural balls. Software quickly 
analyzed complaints of seven key symptoms — from rashes to sore throats — for 
patterns that might indicate the early stages of a bio-attack. There was a brief 
scare: the system noticed a surge in flulike symptoms at military clinics. 
Thankfully, tests confirmed it was just that — the flu. 
</text> 

Quando questa trasformazione viene applicata al documento XML sopra, la lo stesso risultato ottenuto con la prima soluzione.

+1

+1 per una risposta utile. Nota che OP stava estraendo dati da un file XML. – LarsH

+0

@LarsH: Oh, grazie, avevo in qualche modo l'impressione opposta - che voleva trattare con un file di testo normale. Aggiungerò la variante del file XML alla soluzione. –

+0

Wallah! Questo aiuta davvero. Grazie ragazzi. – smandape

2

immagino che tokenize() o <xsl:analyze-string> potrebbe essere utilizzato per fare questo in modo efficiente, utilizzando un regexp che consente fino a (diciamo) 70 caratteri, e termina con un carattere di interruzione (ad esempio spazio).

Per codice esplicito, vedere le risposte XPath e XSLT allo xquery word wrap.

+2

+1 per una buona risposta riassuntiva. –