Pregunta

Estoy generando algunos documentos XML y cuando se trata de la parte de la dirección tengo fragmentos que se ven así:

<Address>15 Sample St
Example Bay
Some Country</Address>

El XSLT que tengo para convertir esto a XHTML tiene una plantilla recursiva original para convertir caracteres de nueva línea dentro de cadenas en etiquetas <br/>.

Esta todo trabajando bien;pero ¿se considera una "mala práctica" confiar en saltos de línea en documentos XML?Si es así, ¿se recomienda que haga esto?

<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>

Parece que sería realmente incómodo envolver cada lugar donde mi texto puede tener varias líneas con etiquetas como esa.

¿Fue útil?

Solución

Generalmente se considera una mala práctica confiar en los saltos de línea, ya que es una forma frágil de diferenciar datos.Si bien la mayoría de los procesadores XML conservarán cualquier espacio en blanco que coloque en su XML, no está garantizado.

El verdadero problema es que la mayoría de las aplicaciones que generan su XML en un formato legible consideran que todos los espacios en blanco en un XML son intercambiables y pueden colapsar esos saltos de línea en un solo espacio.Es por eso que su XSLT tiene que pasar por esos obstáculos para representar los datos correctamente.Usar una etiqueta "br" simplificaría enormemente la transformación.

Otro problema potencial es que si abre su documento XML en un editor XML y lo imprime, es probable que pierda esos saltos de línea.

Si sigue usando LineBreaks, asegúrese de agregar un atributo XML: Space = "Preserve" a "Dirección". (Puedes hacer esto en tu DTD, si estás usando uno).

Algunas lecturas sugeridas

Las aplicaciones XML a menudo parecen tomar una actitud arrogante hacia el espacio en blanco porque las reglas sobre los lugares en un documento XML donde el espacio en el blanco no importa a veces les da a estas aplicaciones una rienda suelta para agregar o eliminar el espacio en blanco en ciertos lugares.

Otros consejos

Pocas personas han dicho que los bloques CDATA le permitirán conservar los saltos de línea.Esto está mal.Las secciones CDATA solo harán que el marcado se procese como datos de caracteres, no cambiar el procesamiento de salto de línea.

<Address>15 Sample St
Example Bay
Some Country</Address>

es exactamente igual que

<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

La única diferencia es cómo las diferentes API informan esto.

Creo que el único problema real es que hace que el XML sea más difícil de leer.p.ej.

<Something>
    <Contains>
        <An>
            <Address>15 Sample St
Example Bay
Some Country</Address>
        </An>
    </Contains>
</Something>

Si el XML bonito no es una preocupación, probablemente no me preocuparía, siempre y cuando esté funcionando.Si le preocupa el XML bonito, convertiría las nuevas líneas explícitas en <br /> etiquetas o \n antes de incrustarlos en el XML.

¿Qué pasa con el uso de atributos para almacenar los datos, en lugar de nodos de texto?

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>

Conozco el uso de atributos vs.Los nodos de texto son un tema que a menudo se debate, pero me he quedado con los atributos el 95% de las veces y no he tenido ningún problema por eso.

Depende de cómo leas y escribas el XML.

Si XML se genera automáticamente (si son líneas nuevas o explícito) orte las banderas se están analizando en
- entonces no hay nada de qué preocuparse.Es probable que su entrada no contenga ningún otro XML, por lo que es más limpio no meterse con XML en absoluto.

Si las etiquetas se trabajan manualmente, en mi opinión, aún es más limpio tener solo un salto de línea.

La excepción es si estás usando DOM para obtener alguna estructura del XML.En ese caso, los saltos de línea son obviamente malos porque no representan la jerarquía adecuadamente.Sin embargo, parece que la jerarquía es irrelevante para su aplicación, por lo que los saltos de línea suenan suficientes.

Si el XML simplemente se ve mal (especialmente cuando se genera automáticamente), Ordenado puede ayudar, aunque funciona mejor con HTML que con XML.

Este es probablemente un ejemplo un poco engañoso, ya que la dirección no está normalizada en este caso.Sin embargo, es una compensación razonable ya que los campos de dirección son difíciles de normalizar.Si hace que los saltos de línea contengan información importante, no estará normalizando y haciendo que la oficina de correos interprete el significado del salto de línea.

Yo diría que normalmente esto no es un gran problema, pero en este caso creo que la etiqueta Línea es más correcta ya que muestra explícitamente que en realidad no se interpreta lo que las líneas pueden significar en diferentes culturas.(Recuerde que la mayoría de los formularios para ingresar una dirección tienen el código postal, etc., y las líneas de dirección 1 y 2).

La incomodidad de tener la etiqueta de línea viene con XML normal y ha sido muy debatida en la codificación del horror. http://www.codinghorror.com/blog/archives/001139.html

La especificación XML tiene algo que decir con respecto a espacio en blanco y avances de línea y retornos de carro en particular.Entonces, si se limita a cambios de línea reales (x0A), debería estar bien.Sin embargo, muchas herramientas de edición reformatearán XML para una "mejor presentación" y posiblemente eliminarán la sintaxis especial.Un enfoque más sólido y limpio que la idea "< línea>< / línea>" sería simplemente usar espacios de nombres e incrustar contenido XHTML, por ejemplo:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>

No es necesario reinventar la rueda cuando se trata de vocabularios estándar.

No veo que tiene de malo <Line> etiquetas.
Aparentemente, la visualización de los datos es importante para usted, lo suficientemente importante como para mantenerla en sus datos (mediante saltos de línea en su primer ejemplo).Bien.Entonces guárdalo de verdad, no confíes en la "magia" para quedártelo.Guarde todos los datos que necesitará más adelante y que no pueda deducir perfectamente de la parte guardada de los datos; consérvelos incluso si se trata de datos de visualización (saltos de línea y otros formatos).Su usuario (usuario final de otro desarrollador) se tomó el tiempo para formatear esos datos a su gusto; dígale (documento API/texto cerca de la entrada) que no tiene intención de conservarlos o simplemente conservarlos.

Sí, creo que usar un CDATA El bloque protegería el espacio en blanco.Aunque algunas API de analizador le permiten conservar los espacios en blanco.

Lo que realmente deberías hacer es convertir tu XML a un formato que conserve los espacios en blanco.

Entonces, en lugar de buscar reemplazar con <br />, debes envolver todo el bloque en un <pre>

De esa manera, su dirección se conserva funcionalmente (ya sea que incluya saltos de línea o no) y el XSTL puede elegir si desea conservar los espacios en blanco en el resultado.

Te recomiendo que agregues el <br/> saltos de línea o tal vez usar entidad de salto de línea - &#x000D;

Si necesita conservar los saltos de línea, utilice un bloque CDATA, como ajustar dijo

De lo contrario, tenga cuidado.La mayoría de las veces, el software XML conservará los saltos de línea, pero a veces no es así, y realmente no querrás depender de cosas que sólo funcionan por coincidencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top