Word XSLT模板 - 更改图像

时间:2012-01-25 16:31:51

标签: xslt

我是XML / XSLT的新手,在修改Word XSLT模板时尝试更改图像时出现问题。

我有4个部分......

  1. Word模板文档
  2. XML文件
  3. XSLT样式表(取自Word模板并将XML添加到占位符中)
  4. PHP代码,它接受XML并将其应用于XSLT模板以生成Word文档。
  5. 除了涉及到图像外,这一切似乎都很有效。基本上,我似乎无法使用XML值来加载图像。

    Word文档 只是一个Word 2007文档,模仿最终输出应该是什么。包含占位符图,我试图在XSLT中动态替换,但无论如何,Word文档模板中的图像似乎总是显示出来。

    XML:

    <Assessment>
      <Title>
        ...
      </Title>
      <Scorecard>
        ...
        <Graph0>http://pathtoimage.jpg</Graph0>
        ...
      </Scorecard>
    </Assessment>
    

    评估/记分卡/图表0是我要插入的图像的路径。

    XSLT:

    ...
    
    <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:tc>
      <w:tcPr>
        <w:tcW w:w="0" w:type="auto"/>
        <w:tcMar>
          <w:top w:w="75" w:type="dxa"/>
          <w:left w:w="300" w:type="dxa"/>
          <w:bottom w:w="75" w:type="dxa"/>
          <w:right w:w="75" w:type="dxa"/>
        </w:tcMar>
        <w:vAlign w:val="center"/>
        <w:hideMark/>
      </w:tcPr>
      <w:p w:rsidR="0057097D" w:rsidRDefault="0057097D">
        <w:pPr>
          <w:pStyle w:val="Heading3"/>
          <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:rPr>
          <w:t xml:space="preserve">Prepared for: <xsl:value-of select="Assessment/Title/CompanyName" /></w:t>
        </w:r>
      </w:p>
      <w:p w:rsidR="0057097D" w:rsidRDefault="0057097D">
        <w:pPr>
          <w:pStyle w:val="Heading3"/>
          <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:rPr>
          <w:t><xsl:value-of select="Assessment/Title/ReportDate" /></w:t>
        </w:r>
      </w:p>
      <xsl:for-each select="Assessment/Title/Address">
        <w:p w:rsidR="0057097D" w:rsidRDefault="0057097D">
          <w:pPr>
            <w:pStyle w:val="NormalWeb"/>
            <w:rPr>
              <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
            </w:rPr>
          </w:pPr>
          <w:r>
            <w:rPr>
              <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
            </w:rPr>
            <w:t><xsl:value-of select="Line" /></w:t>
          </w:r>
        </w:p>
      </xsl:for-each>
    </w:tc>
    

    其中{Assessment / Scorecard / Graph0}是新图像的占位符。

    PHP

    $xmlDataFile = ("Assessment.xml");
    $xsltFile = ("Assessment.xslt");
    $sourceTemplate = ("AssessmentTemplate.docx");
    $outputDocument = ("Assessment.docx");
    
    $xmlDocument = new DOMDocument();
    $xmlDocument->load($xmlDataFile);
    
    $xsltDocument = new DOMDocument();
    $xsltDocument->load($xsltFile);
    
    $xsltProcessor = new XSLTProcessor();
    $xsltProcessor->importStylesheet($xsltDocument);
    
    $newContent =  $xsltProcessor->transformToXML($xmlDocument);
    
    if (copy($sourceTemplate, $outputDocument)) {
        $zipArchive = new ZipArchive();
        $zipArchive->open($outputDocument);
        $zipArchive->addFromString("word/document.xml", $newContent);
        $zipArchive->close();
    }
    

    这将所有内容放在一起并生成我的最终Word文档。正如我所说,除了图像之外,一切都很好。所有文本值都更新为XML文件中的值,但我似乎无法更新图像。

    对于我正在使用的值:

    <xsl:value-of select="..." />
    

    对于不起作用的值(图像),我正在使用:

    {Assessment/Scorecard/Graph0} 
    

    我认为这与插入XML内容的方法有关,但它也不会接受用于大括号方法的方法的值 - 并且实际上会破坏文档。

    有什么建议吗?有更好的方法吗?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

两个建议。 您可以在使用之前添加注释以调试Assessment / Scorecard / Graph0的值

 <xsl:comment><xsl:value-of select="Assessment/Scorecard/Graph0"/></xsl:comment>

Second, you could change
<wp:docPr id="3" name="Picture 3" descr="{Assessment/Scorecard/Graph0}"/>

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