在 MS Word 中使用 XPath select 来自特定节点的属性
Using XPath in MS Word to select an attribute from a specific node
我们的学生信息系统 (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 文档中,我创建了一个带有静态 header 行的 table。 table 合并字段命令的开头和结尾是:
{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 的邮件合并引擎来说是否过于复杂,或者是否存在我没有看到的语法错误?
你试过了吗:
{MERGEFIELD StudentSchoolYear/StudentClass[@PeriodBegin='1']/@TeacherFormattedname \* MERGEFORMAT }
这假定您只有一个带有 @PeriodBegin=1 的 StudentClass 元素,但根据该假设您不需要 [1].
我必须承认我从未见过部分括号的 XPath,这可能就是您遇到语法错误的原因。
您收到此错误,
Error: '(StudentSchoolYear/StudentClass[@PeriodBegin=’1’])' has an invalid token.
因为您的 XPath 表达式使用单个 curly/smart 引号而不是围绕 1
的 straight/dumb 引号。将 ’1’
更改为 '1'
以解决此问题。
我们的学生信息系统 (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 文档中,我创建了一个带有静态 header 行的 table。 table 合并字段命令的开头和结尾是:
{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 的邮件合并引擎来说是否过于复杂,或者是否存在我没有看到的语法错误?
你试过了吗:
{MERGEFIELD StudentSchoolYear/StudentClass[@PeriodBegin='1']/@TeacherFormattedname \* MERGEFORMAT }
这假定您只有一个带有 @PeriodBegin=1 的 StudentClass 元素,但根据该假设您不需要 [1].
我必须承认我从未见过部分括号的 XPath,这可能就是您遇到语法错误的原因。
您收到此错误,
Error: '(StudentSchoolYear/StudentClass[@PeriodBegin=’1’])' has an invalid token.
因为您的 XPath 表达式使用单个 curly/smart 引号而不是围绕 1
的 straight/dumb 引号。将 ’1’
更改为 '1'
以解决此问题。