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

时间:2016-09-23 16:04:19

标签: xml xpath ms-word mailmerge

我们的学生信息系统(Synergy)允许我们在MS Word中创建邮件合并文档以替换现有报告。为此,我正在尝试替换的报告生成以下(简化)XML:

calc()

正如您所看到的,学生可以免费使用3期和8期,并且XML不会为这些期间中的任何一个提供节点。我试图从这个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>

如果学生没有那个时期的课程,那么最后的输出应该在句号栏中有空白。

在Word文档中,我创建了一个带有静态标题行的表。表mergefield命令的开头和结尾是:

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

{MERGEFIELD TableStart:REV_DATA_ROOT/Student \* MERGEFORMAT }

并放置在第二行的第一个和最后一个单元格中。我可以毫无问题地获得打印的名称和等级。如果我告诉它选择一个特定的位置,我可以得到教师和房间号码,即:

{MERGEFIELD TableEnd:REV_DATA_ROOT/Student \* MERGEFORMAT }

不幸的是,如果我每个时期都这样做(更新数字以匹配我想要的时间段号码),对于这个学生,它将在P3列中打印P4,在P4中打印P5等。

Stack Overflow上的另一个问题让我尝试了这个:

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

这会产生错误:

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

我的问题:我正在尝试为Word的邮件合并引擎做太复杂,或者是否存在我没​​有看到的语法错误?

2 个答案:

答案 0 :(得分:1)

你试过了吗?

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

这假设你只有一个带有@ PeriodBegin = 1的StudentClass元素,但有了这个假设,你就不需要[1]。

我必须承认,我从未见过部分括号内的XPath,这可能就是您收到语法错误的原因。

答案 1 :(得分:1)

您收到此错误,

  

错误:&#39;(StudentSchoolYear / StudentClass [@ PeriodBegin ='1'])&#39;有一个无效的令牌。

因为您的XPath表达式使用单个卷曲/智能引号而不是围绕1的直/哑引号。将’1’更改为'1'以解决此问题。