I'm trying to change the value of an attribute of the word ml schema with an XML value.
...
<wp:docPr id="3" name="Picture 3" descr="http://pathtoimage.png"/>
...
I'd like to change the descr value with the XML value like this...
...
<wp:docPr id="3" name="Picture 3" descr="<xsl:value-of select='Assessment/Scorecard/Graph0' />" />
...
But this doesn't work. It doesn't like the xsl value-of inline. I've also tried this...
...
<wp:docPr id="3" name="Picture 3" descr="{Assessment/Scorecard/Graph0}" />
...
This doesn't cause any errors, but also doesn't work.
Is there any other method to modify the value inline with the XML value?
Updating with more detail...
XML
<?xml version="1.0" encoding="utf-8"?>
<Assessment>
<Title>
<CompanyName>Company Name</CompanyName>
<ReportDate>January 25th, 2012</ReportDate>
<Address>
<Line>Line 1</Line>
</Address>
<Address>
<Line>Line 2</Line>
</Address>
<Address>
<Line>Line 3</Line>
</Address>
<Address>
<Line>Line 4</Line>
</Address>
</Title>
<Scorecard>
<SuppliesAndServiceLogistics>5.2</SuppliesAndServiceLogistics>
<PrintingHardwareUsage>5.3</PrintingHardwareUsage>
<TechnologyReliabilityAndUserProductivity>4.2</TechnologyReliabilityAndUserProductivity>
<EnvironmentalImpact>3.0</EnvironmentalImpact>
<Expense>1.8</Expense>
<Graph0>http://path_to_image/Graph0.png</Graph0>
<Savings>$43,526</Savings>
</Scorecard>
...
</Assessment>
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<w:document
xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<w:body>
...
<w:p w:rsidR="0057097D" w:rsidRDefault="0057097D">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:eastAsia="Times New Roman" w:hAnsi="Arial" w:cs="Arial"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Arial" w:eastAsia="Times New Roman" w:hAnsi="Arial" w:cs="Arial"/>
<w:noProof/>
</w:rPr>
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0">
<wp:extent cx="5709285" cy="1524000"/>
<wp:effectExtent l="19050" t="0" r="5715" b="0"/>
<wp:docPr id="3" name="Picture 3" descr="{Assessment/Scorecard/Graph0}"/>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="Picture 3" descr="{Assessment/Scorecard/Graph0}"/>
<pic:cNvPicPr>
<a:picLocks noChangeAspect="1" noChangeArrowheads="1"/>
</pic:cNvPicPr>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId9" r:link="rId10" cstate="print"/>
<a:srcRect/>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr bwMode="auto">
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="5709285" cy="1524000"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
<a:noFill/>
<a:ln w="9525">
<a:noFill/>
<a:miter lim="800000"/>
<a:headEnd/>
<a:tailEnd/>
</a:ln>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
...
</w:body>
</w:document>
PHP
...
$xmlDataFile = ("Assessment.xml");
$xsltFile = ("Assessment.xslt");
$sourceTemplate = ("AssessmentTemplate.docx");
$outputDocument = ("Assessment.docx");
//Load the xml data and xslt and perform the transformation.
$xmlDocument = new DOMDocument();
$xmlDocument->load($xmlDataFile);
$xsltDocument = new DOMDocument();
$xsltDocument->load($xsltFile);
$xsltProcessor = new XSLTProcessor();
$xsltProcessor->importStylesheet($xsltDocument);
//After the transformation, $newContentNew contains
//the XML data in the Open XML Wordprocessing format.
$newContent = $xsltProcessor->transformToXML($xmlDocument);
//Copy the Word 2007 template document to the output file.
if (copy($sourceTemplate, $outputDocument)) {
//Open XML files are packaged following the Open Packaging
//Conventions and can be treated as zip files when
//accessing their content.
$zipArchive = new ZipArchive();
$zipArchive->open($outputDocument);
//Replace the content with the new content created above.
//In the Open XML Wordprocessing format content is stored
//in the document.xml file located in the word directory.
$zipArchive->addFromString("word/document.xml", $newContent);
$zipArchive->close();
}
For whatever reason, it's not changing the image in the generated document. It's using the existing image in the Word Document Template.
Thanks John
Ok, so aparently my code above is working fine. The issue is with Word 2007 caching images. I'm able to update the files in the word/media folder so the correct images are in there, but when viewing the word document itself, the cached image is still being displayed.
I've created a followup question here if you're having the same problem.
Thanks for all your help!