2011-05-14 19 views
13
archivo XML

1:conversión de archivo XML en otro archivo XML mediante XSLT

<?xml version="1.0"?> 
<rentalProperties> 
    <property contact ="1"> 
     <type>House </type> 
     <price>420</price> 
     <address> 
      <streetNo>1</streetNo> 
      <street>Wavell Street</street> 
      <suburb>Box Hill</suburb> 
      <state>VIC</state> 
      <zipcode>3128</zipcode> 
     </address> 
     <numberOfBedrooms>3</numberOfBedrooms> 
     <numberOfBathrooms>1</numberOfBathrooms> 
     <garage>1</garage> 
    </property> 

archivo XML 2:

<?xml version="1.0"?> 
<rentalProperties> 
    <property contact ="1"> 
     <type>House </type> 
     <price>420</price> 
     <address>1 wavell street,Box Hill,VIC,Australia</address> 
     <numberOfBedrooms>3</numberOfBedrooms> 
     <numberOfBathrooms>1</numberOfBathrooms> 
     <garage>1</garage>  
    </property> 

¿Cómo debo convertir el archivo XML XML 1 a 2 fle mediante XSLT? quiero representar la dirección como una sola línea y agregar un nuevo atributo [country-Australia] al final de la línea. Hice el resto. Estoy luchando con la línea de dirección

archivo XSLT:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" type="text/css" href="style.css"> 
    <xsl:template match="/"> 
     <rentalProperties> 
      <property> 
       <xsl:attribute name="contact"><xsl:value-of select='@contact'/></xsl:attribute>  
       <type><xsl:value-of select="type"/></type> 
       <price><xsl:value-of select="price"/></price> 
       <numberOfBedrooms><xsl:value-of select="numberOfBedrooms"/></numberOfBedrooms> 
       <numberOfBathrooms><xsl:value-of select="numberOfBathrooms"/></numberOfBathrooms> 
       <garage><xsl:value-of select="garage"/></garage>  
      </property>  
     </rentalProperties>  
    </xsl:template> 
</xsl:stylesheet> 

Respuesta

1

Usted puede intentar algo como:

<address> 
    <xsl:for-each select="address/*"> 
     <xsl:value-of select="."/>, 
    </xsl:for-each> 
    Australia 
</address> 

Este bucle recorre todos los hijos de la etiqueta de la dirección en xml1.

+0

gracias u mucho – shavinda

3

Usted podría introducir una nueva plantilla para el bloque de direcciones utilizando

<xsl:template match="address"> 
    <xsl:value-of select="streetNo" /> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="street" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="suburb" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="state" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="zipcode" /> 
</xsl:template> 

y llamarlo con

<xsl:apply-templates select="address" /> 

antes del elemento <numberOfBedrooms>. Esto también se puede hacer usando la función concat, mientras que la sintaxis correcta no la recuerdo en este momento.

+0

gracias u mucho – shavinda

25

Esta transformación:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="address"> 
    <xsl:copy> 
    <xsl:value-of select= 
    "concat(streetNo, ' ', street, ',', 
      suburb,',', state,', Australia') 
    "/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="address/node()"/> 
</xsl:stylesheet> 

cuando se aplica en el documento XML proporcionado:

<rentalProperties> 
    <property contact ="1"> 
     <type>House </type> 
     <price>420</price> 
     <address> 
      <streetNo>1</streetNo> 
      <street>Wavell Street</street> 
      <suburb>Box Hill</suburb> 
      <state>VIC</state> 
      <zipcode>3128</zipcode> 
     </address> 
     <numberOfBedrooms>3</numberOfBedrooms> 
     <numberOfBathrooms>1</numberOfBathrooms> 
     <garage>1</garage> 
    </property> 
</rentalProperties> 

produce el, resultado correcto deseada:

<rentalProperties> 
    <property contact="1"> 
     <type>House </type> 
     <price>420</price> 
     <address>1 Wavell Street,Box Hill,VIC, Australia</address> 
     <numberOfBedrooms>3</numberOfBedrooms> 
     <numberOfBathrooms>1</numberOfBathrooms> 
     <garage>1</garage> 
    </property> 
</rentalProperties> 

Explicación: Uso y anulación de identity rule.

+0

referencia excepcional y un buen trabajo aquí – Eon

-1
<rentalProperties> 
    <property contact="1"> 
     <type>House </type> 
     <price>420</price> 
     <address>1 Wavell Street,Box Hill,VIC,3128</address> 
     <numberOfBedrooms>3</numberOfBedrooms> 
     <numberOfBathrooms>1</numberOfBathrooms> 
     <garage>1</garage> 
    </property> 
</rentalProperties> 
+2

Código de sólo respuestas casi siempre puede ser mejorado mediante la adición de unas pocas frases explicativas; puedes [editar] tu respuesta para hacerlo. –

+0

¿Cuál es la solución aquí? –