2016-09-23 111 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

错误是由聪明的引号引起的,但我继续前进,将实际表达式更改为您的建议,因为它对我更有意义。非常感谢你! –

相关问题