【问题标题】:Using XPath in MS Word to select an attribute from a specific node在 MS Word 中使用 XPath 从特定节点中选择属性
【发布时间】:2017-02-01 13:42:41
【问题描述】:

我们的学生信息系统 (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 的邮件合并引擎,我尝试做的事情是否过于复杂,或者是否存在我没​​有看到的语法错误?

【问题讨论】:

    标签: xml xpath ms-word mailmerge


    【解决方案1】:

    您收到此错误,

    错误:'(StudentSchoolYear/StudentClass[@PeriodBegin='1'])' 的令牌无效。

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

    【讨论】:

    • 这修复了错误。我不知道那些讨厌的智能引号是从哪里来的,因为我通常在 Text Wrangler 中键入表达式,然后将其复制并粘贴到该字段中。谢谢!
    【解决方案2】:

    你试过了吗:

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

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

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

    【讨论】:

    • 错误是由智能引号引起的,但我继续将实际表达式更改为您建议的内容,因为这对我来说更有意义。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多