0

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

...
<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 文档模板中的现有图像。

谢谢约翰

4

2 回答 2

1

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)?

于 2012-01-25T22:46:28.267 回答
0

好的,所以显然我上面的代码工作正常。问题在于 Word 2007 缓存图像。我可以更新 word/media 文件夹中的文件,以便其中包含正确的图像,但是在查看 word 文档本身时,缓存的图像仍在显示中。

如果您遇到同样的问题,我在这里创建了一个后续问题。

感谢你的帮助!

于 2012-01-27T14:25:15.510 回答