2016-09-23 114 views
0

我們的學生信息系統(Synergy)允許我們在MS Word中創建郵件合併文檔以替換現有報告。爲此我試圖替換報表生成以下(簡化)XML:在MS Word中使用XPath從特定節點選擇屬性

<REV_REPORT> 
    <REV_HEADER> 
    <NAME>Student Schedule List</NAME> 
    <NUMBER>STU415</NUMBER> 
    <ORGANIZATION>My Fine High School</ORGANIZATION> 
    <YEAR_TITLE>2016-2017</YEAR_TITLE> 
    </REV_HEADER> 
    <REV_DATA_ROOT> 
    <Student Grade="12" StudentName="Smith, John J." > 
     <StudentSchoolYear OrganizationName="My Fine High School"> 
     <StudentClass PeriodBegin="1" RoomName="202-B" TeacherFormattedName="Able, J." /> 
     <StudentClass PeriodBegin="2" RoomName="STD1-B" TeacherFormattedName="Baker, M." /> 
     <StudentClass PeriodBegin="4" RoomName="614-H3" TeacherFormattedName="Channing, B." /> 
     <StudentClass PeriodBegin="5" RoomName="BAND1-A" TeacherFormattedName="Donner, T." /> 
     <StudentClass PeriodBegin="6" RoomName="805-H4" TeacherFormattedName="Enfield, K." /> 
     <StudentClass PeriodBegin="7" RoomName="205-H1" TeacherFormattedName="Gonzalez, A." /> 
     </StudentSchoolYear> 
    </Student> 
    </REV_DATA_ROOT> 
</REV_REPORT> 

正如你所看到的,學生有時間3,8免費的,XML沒有給出一個節點任何一個時期。我想生成該XML的東西,看起來像這樣:

Student Name Gr P1   P2   P3  P4   P5   P6   P7   P8 
Smith, John J. 12 Able, J. Baker, M.   Channing, B. Donner, T. Enfield, K. Gonzalez, A. 
         202-B  STD1-B    614-H3  BAND1-A  805-H4  205-H1 

最終的輸出應該有一個時段列空白,如果學生沒有課的那段時間。

在Word文檔中,我創建了一個帶有靜態標題行的表。的開始和表格的結束MERGEFIELD命令有:

{MERGEFIELD TableStart:REV_DATA_ROOT/Student \* MERGEFORMAT } 

{MERGEFIELD TableEnd:REV_DATA_ROOT/Student \* MERGEFORMAT } 

和被放置在所述第二行的第一個和最後的細胞。我可以在沒有任何問題的情況下獲得打印的名稱和等級。我能得到老師和房間號打印,如果我告訴它選擇一個特定的位置,即:

{MERGEFIELD StudentSchoolYear/StudentClass[1]/@TeacherFormattedname \* MERGEFORMAT } 
{MERGEFIELD StudentSchoolYear/StudentClass[1]/@RoomNumber \* MERGEFORMAT } 

不幸的是,如果我這樣做,對於每個時段(更新數以匹配我想要的週期數) ,該學生將在P4打印P4在列P3,P5等

這裏Stack Overflow另外一個問題使我試試這個:

{MERGEFIELD (StudentSchoolYear/StudentClass[@PeriodBegin=’1’])[1]/@TeacherFormattedName \* MERGEFORMAT } 
{MERGEFIELD (StudentSchoolYear/StudentClass[@PeriodBegin=’1’])[1]/@RoomNumber \* MERGEFORMAT } 

這給出瞭如下錯誤:

Error: '(StudentSchoolYear/StudentClass[@PeriodBegin=’1’])' has an invalid token. 

我的問題:我試圖做的太複雜的Word的郵件合併引擎,或者是否有一個語法錯誤,我沒有看到?

回答

1

您收到此錯誤,

Error: '(StudentSchoolYear/StudentClass[@PeriodBegin=’1’])' has an invalid token.

,因爲你的XPath表達式使用單捲曲/智能引號代替周邊1直/啞報價。將’1’更改爲'1'以解決此問題。

+0

這解決了這個錯誤。我不知道那些討厭的智能引用來自哪裏,因爲我通常在Text Wrangler中輸入表達式,然後將其複製並粘貼到字段中。謝謝! –

1

你試過:

{MERGEFIELD StudentSchoolYear/StudentClass[@PeriodBegin='1']/@TeacherFormattedname \* MERGEFORMAT } 

這裏假設你永遠只能有一個@ PeriodBegin = 1一個StudentClass元素,但這個假設你不應該需要[1]。

我必須承認,我從來沒有見過XPath是一部分括號,這可能是你爲什麼得到語法錯誤。

+0

錯誤是由聰明的引號引起的,但我繼續前進,將實際表達式更改爲您的建議,因爲它對我更有意義。非常感謝你! –