2014-01-10 103 views
1

我想通過使用字段w:fldLock設置鎖來防止更新word文檔字段。我有一個xml文件,其中包含節點w:fldSimple。每當我找到這個節點時,我想將屬性w:fldLock設置爲這個節點。爲了實現這一點,我想使用XSLT轉換。您能否告訴我樣本XSL轉換?將新的xml屬性插入MS Word xml文檔元素

示例XML數據:

<?xml version="1.0" encoding="utf-8" ?> 
<w:hdr mc:Ignorable="w14 wp14" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="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:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" 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:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"> 
    <w:p w:rsidR="00235C27" w:rsidRDefault="00235C27"> 
     <w:pPr> 
     <w:pStyle w:val="Header" /> 
     </w:pPr> 
     <w:fldSimple w:instr="MERGEFIELD firstname \* MERGEFORMAT"> 
     <w:r> 
      <w:rPr> 
       <w:noProof /> 
      </w:rPr> 
      <w:t>John</w:t> 
     </w:r> 
     </w:fldSimple> 
    </w:p> 
</w:hdr> 

的XSLT後我的輸出應該是一個XML文件是這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<w:hdr mc:Ignorable="w14 wp14" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="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:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" 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:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"> 
    <w:p w:rsidR="00235C27" w:rsidRDefault="00235C27"> 
     <w:pPr> 
     <w:pStyle w:val="Header" /> 
     </w:pPr> 
     <w:fldSimple w:instr="MERGEFIELD firstname \* MERGEFORMAT" w:fldLock = "1"> 
     <w:r> 
      <w:rPr> 
       <w:noProof /> 
      </w:rPr> 
      <w:t>John</w:t> 
     </w:r> 
     </w:fldSimple> 
    </w:p> 
</w:hdr> 

請告訴我這個?

回答

0

以下應該做的伎倆。它使用的身份變換的副本的所有元素,然後處理w:fldSimple

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
     version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <!-- Modify the identity transform to slip in the extra attribute --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:if test="name()='w:fldSimple'"> 
      <xsl:attribute name="w:fldLock">1</xsl:attribute> 
     </xsl:if> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

(屬性第一次添加,但是這不應該的問題)

<w:fldSimple w:fldLock="1" w:instr="MERGEFIELD firstname \* MERGEFORMAT"> 
+0

我試過了。你能簡單地解釋一下上面的代碼嗎? – user3181200

+0

[identity transform](http://en.wikipedia.org/wiki/Identity_transform)是一種常用模式,用於遞歸複製xml文件逐個片段。我通過尋找'w:fldSimple'來'偷偷'找到你需要的屬性,從而入侵*身份*。更常見的情況是,您應該保持身份轉換爲「純」,然後明確讓其他模板訂閱變化 - 例如根據我的[先前的編輯](http://stackoverflow.com/posts/21041939/revisions)。然而,由於這看起來是一次性的屬性轉換,所以爲了簡潔起見,我將它改爲*身份*。 – StuartLC

+0

我遵循我現有的一個xslt代碼來實現此行爲。但它給出了一個錯誤,指出「XML文檔必須具有頂級元素」。 請找到下面的代碼: – user3181200

0

請讓我知道這個代碼是否是可能的? @StuartLc因爲我不知道身份變換,請讓我知道您的代碼是否安全?

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
       version="1.0"> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 


    <xsl:template match="node()"> 
    <xsl:choose> 
     <xsl:when test="starts-with(name(),'w:fldSimple')"> 
     <xsl:element name="{name()}"> 
      <xsl:attribute name="w:fldLock"> 
      1 
     </xsl:attribute> 
      <xsl:apply-templates select="node()"/> 
     </xsl:element> 
     </xsl:when> 
     <xsl:when test="name()=''"> 
     <xsl:value-of select="."/> 
     <xsl:copy-of select="@*"/> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet>