使用 XPath 在带有 HelpNDoc 自定义模板的 XML 文件中定位节点

Using XPath to locate a node in a XML file with a HelpNDoc custom template

我正在尝试增强与 HelpNDoc 一起使用的 HTML 模板。我发现缺少的一件事是 meta description 标签对于所有页面都是相同的。

模板文件混合了 pascal 和 HTML。目前这是显示描述标签的模板中的数据:

<meta name="description" content="<% print(HndProjects.GetProjectSummary()); %>" />

我创建了一个包含所需描述的映射 XML 文档。示例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<HelpTopics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Topic>
        <Caption>Overview</Caption>
        <ID>msa-overview</ID>
        <ContextID>0</ContextID>
        <Description>An introduction to Meeting Schedule Assistant.</Description>
    </Topic>
    <Topic>
        <Caption>Quick Start - Getting Started</Caption>
        <ID>msa-quick-start</ID>
        <ContextID>1</ContextID>
        <Description>A quick start guide to get you up and running with Meeting Schedule Assistant.</Description>
    </Topic>
    <Topic>
        <Caption>Using Meeting Schedule Assistant</Caption>
        <ID>msa</ID>
        <ContextID>2</ContextID>
        <Description>An overview of the menus in Meeting Schedule Assistant.</Description>
    </Topic>
</HelpTopics>

是否可以在这个 HelpnDoc 脚本中使用 pascal 来读取 XML 文件?在他们的网站上,他们提供了有关 HndProjects 的详细信息,并提到:

function GetProjectId: string;

Returns the currently open project id.

所以我基本上想从 XML 数据文件中获取这个值:

HelpTopics/Topic/ID[text()='<% HndProjects.GetProjectId(); %>'

但我不知道如何将这样的 XPath 与 HelpNDoc Pascal 脚本一起使用。

更新

我尝试添加此代码以开始:

function GetDescription(sTopicID: string): String;
var
    nodeTopic: TDOMNode;
    doc: TXMLDocument;
begin
    try
        // Read in the xml file
        ReadXMLFile(doc, '.\MSA-Help-Descriptions.xml');
        // Get the node
        //nodeTopic := doc.DocumentElement.FindNode(
        // How do we get the node at:  HelpTopics/Topic/ID[text()=sTopicID];
    finally
        doc.Free;
    end;
    GetDescription := 'xxxx';
end;

然后,在 HelpNDoc 中,我尝试编译脚本,但出现以下错误:

所以我不确定我是否可以做我想做的,除非我错过了一些步骤。

我从软件作者那里得到了反馈:

Please know that HelpNDoc's scripting engine is only a subset of the pascal language and libraries. There are no XML libraries available in the scripting language. It may be possible to use a third-party XML library but this is not something that we tested or support.

We recommend that you work with simpler structures which can be easily parsed via simple code such as comma separated (CSV) files.

因此,我创建了一个简单的文本文件,其中每一行代表一个元描述,行号与帮助主题的上下文 ID 匹配。

然后我修改了用于编译的pascal脚本:

function ReadFile(helpContextID: integer): string;
var
    FText  : TStringList;
begin
    FText := TStringList.Create;
    try
       FText.LoadFromFile('D:\My Programs17\MeetSchedAssist\HelpNDoc\HelpTopicDescriptions.txt');
       result := FText[helpContextID];
    finally
       FText.Free;
    end;
end;

最后,我进行了以下调用来设置元描述:

<meta name="description" content="<% print(ReadFile(HndTopics.GetTopicHelpContext(HndGeneratorInfo.CurrentTopic))); %>" />

更新

为了它的价值,我通过将 TStringList 设为全局变量来改进代码。然后我只将数据文件读入此列表一次,并在创建元描述时使用它。最后,我在脚本文件中的构建过程结束时释放了列表。