WordML内联更新属性

时间:2012-01-25 17:54:20

标签: xml xslt wordml

我正在尝试使用XML值更改单词ml schema的属性值。

...
<wp:docPr id="3" name="Picture 3" descr="http://pathtoimage.png"/>
...

我想用这样的XML值改变descr值......

...
<wp:docPr id="3" name="Picture 3" descr="<xsl:value-of select='Assessment/Scorecard/Graph0' />" />
...

但这不起作用。它不喜欢内联的xsl值。我也试过这个......

...
<wp:docPr id="3" name="Picture 3" descr="{Assessment/Scorecard/Graph0}" />
...

这不会导致任何错误,但也无效。

是否有其他方法可以使用XML值修改内联值?

更新详情......

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();
}

无论出于何种原因,它都不会更改生成的文档中的图像。它使用Word文档模板中的现有图像。

由于 约翰

2 个答案:

答案 0 :(得分:1)

我尝试了转换,结果很好(即descr属性的值来自Assessment.xml)。你确定addFromString方法成功吗?它返回一个bool值来表示结果。它是否可能失败,因为存档中已存在word / document.xml且无法覆盖(即您需要先将其删除)?

答案 1 :(得分:0)

好的,我上面的代码显然工作正常。问题出在Word 2007缓存图像上。我能够更新word / media文件夹中的文件,以便在那里显示正确的图像,但是当查看word文档本身时,仍然会显示缓存的图像。

如果您遇到同样的问题,我已经创建了一个后续问题here

感谢您的帮助!