我们的学生信息系统(Synergy)允许我们在MS Word中创建一个邮件合并文档来取代现有的报告。为此,我试图替换的报告生成以下(简化的)XML:
<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 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 }
不幸的是,如果我对每个周期都这样做(更新数字以匹配我想要的周期数字),对于这个学生,它将在P3列中打印P4,在P4中打印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的邮件合并引擎,还是有一个语法错误,我没有看到?
您正在接收这个错误,
错误:'(StudentSchoolYear/StudentClass[@PeriodBegin= ' 1 '])'有无效的令牌。
,因为您的XPath表达式使用单花括号/智能引号而不是围绕1
的直/哑引号。
’1’
更改为'1'
以解决此问题。你试过了吗:
{MERGEFIELD StudentSchoolYear/StudentClass[@PeriodBegin='1']/@TeacherFormattedname * MERGEFORMAT }
这里假设你只有一个带有@PeriodBegin=1的StudentClass元素,但是有了这个假设,你就不需要[1]了。
我必须承认我从未见过用部分括号括起来的XPath,这可能就是为什么会出现语法错误的原因。