Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I'm trying to combine two xml-files and with a XSLT-file transform them into a XHTML-page. I have not done this before and can´t figure out how to do it. This is what I have so far, with just one xml-file:

<?php

$xsl = new DOMDocument();
$xsl->load("file.xsl");
$inputdom = new DomDocument();
$inputdom->load("file.xml");

$proc = new XSLTProcessor();
$xsl = $proc->importStylesheet($xsl);
$proc->setParameter(null, "", "");

$newdom = $proc->transformToDoc($inputdom);
print $newdom-> saveXML();

xsl-file with the :ss namespace. I'm not really sure how to use the ss prefix?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

<xsl:template match="/">
  <html>
  <body>

  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Title2</th>
    </tr>
    <xsl:for-each select="something/some">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="title2"/></td>
    </tr>
   </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

xml-file

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="file.xsl"?>
<something>
  <some>
    <Firstname>Peter</Firstname>
    <Lastname>Anderson</Lastname>
  <some>
.....

If somebody could give me a kick in the right direction I would be grateful.

Here is the second xml-file:

<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Created>2012-09-25T13:44:01Z</Created>
  </DocumentProperties>
 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  <AllowPNG/>
 </OfficeDocumentSettings>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>14060</WindowHeight>
  <WindowWidth>25040</WindowWidth>
  <WindowTopX>25540</WindowTopX>
  <WindowTopY>4100</WindowTopY>
  <Date1904/>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s62">
   <Font ss:FontName="Courier" ss:Color="#000000"/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Workbook1.csv">
  <Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="79" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">
   <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="43"/>
   <Column ss:AutoFitWidth="0" ss:Width="113"/>
   <Column ss:Index="5" ss:AutoFitWidth="0" ss:Width="220"/>
   <Row ss:Index="6">
    <Cell ss:Index="3" ss:StyleID="s62"/>
   </Row>
   <Row>
    <Cell ss:Index="3" ss:StyleID="s62"/>
   </Row>
    <Row>
    <Cell ss:Index="3" ss:StyleID="s62"/>
   </Row>
   <Row>
    <Cell ss:Index="2"><Data ss:Type="String">id</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">latitude</Data></Cell>
    <Cell><Data ss:Type="String">longitude</Data></Cell>
   </Row>
   <Row>
    <Cell ss:Index="2"><Data ss:Type="Number">8</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="Number">57.4999</Data></Cell>
    <Cell><Data ss:Type="Number">15.8280</Data></Cell>
   </Row>
.....

So my question is how to combine data from both XML-files with the XSLT? I want the result to be the data in a table on a XHTML-page.

share|improve this question
    
You'll probably need to make use of the document function in your XSLT, but to give fuller details it would help if you showed your second XML and explain what you are trying to achieve. Thanks! –  Tim C Dec 6 '12 at 12:57
    
Thanks for your answer. Edited my question, hope it helps –  ana Dec 6 '12 at 13:52
    
The first XML file contains a list of names, the second XML file a list of co-ordinates. Is there any connection between the data to link then, or do you simply want the data to be displayed separately in the same page? Combining files is not usually difficult, but your second XML file is actually an Excel XML file, and converting that to a table is a whole separate issue in itself, even without involving a second file! –  Tim C Dec 6 '12 at 14:31
    
I have managed to combine the files and get data from the first xml-file, bur I can't get anything from the Excel XML file, any ideas? –  ana Dec 7 '12 at 11:02
    
Is this the same question as stackoverflow.com/questions/13760289/… ? –  Tim C Dec 7 '12 at 13:35

1 Answer 1

This might be an answer to part of your question.

With regard to using two XML files, you have a couple of options. You could combine the two XML files into one larger one, then apply a transform to that. Alternatively, you could use the XSLT document() function to load one of the XML files from within an XSLT.

1. Make one large XML document

<?php

// XML
$x1 = file_get_contents("file1.xml");
$x2 = file_get_contents("file2.xml");
$xml_doc = new DOMDocument();
$xml_doc->loadXML("<root><x1>$x1</x1><x2>$x2</x2></root>");

// XSL
$xsl_doc = new DOMDocument();
$xsl_doc->load("file.xsl");

// Proc
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl_doc);
$newdom = $proc->transformToDoc($xml_doc);

print $newdom->saveXML();

?>

2. Use the XSTL document() function

<?php

// XML
$xml_doc = new DOMDocument();
$xml_doc->load("file1.xml");


// XSL
$xsl_doc = new DOMDocument();
$xsl_doc->load("file.xsl");

// Proc
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl_doc);
$newdom = $proc->transformToDoc($xml_doc);

print $newdom->saveXML();

?>


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:variable name="file2" select="document('file2.xml')/*"/>

  <xsl:template match="/">
    <xsl:copy-of select="$file2"/>
  </xsl:template>

</xsl:transform>

I tend to use the first technique more than the second. I don't like hardcoding filenames into XSLT templates. When I do use the second method, I would usually pass in the filename as an external parameter to avoid having it hardcoded in the XSLT.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.