WordML Updating Attributes Inline

619 views Asked by At

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

2

There are 2 answers

0
johnnycanehdian On

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!

1
Pawel On

I tried the transformation and the result was fine (i.e. the value of the descr attribute was taken from the Assessment.xml). Are you sure that addFromString method is successful? It returns a bool value to indicate the result. Is it possible that it fails because there word/document.xml already exists in the archive and cannot be overwritten (i.e. you need to delete it first)?