在MS Word中使用XPath从特定节点选择属性



我们的学生信息系统(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,这可能就是为什么会出现语法错误的原因。

相关内容

  • 没有找到相关文章

最新更新