代码之家  ›  专栏  ›  技术社区  ›  Andrew Truckle

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

  •  0
  • Andrew Truckle  · 技术社区  · 7 年前

    我正在尝试增强我的html模板,它是与helpndoc一起使用的。我发现我缺少的一件事是 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;

    返回当前打开的项目ID。

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

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

    但是我不知道如何在helpndoc pascal脚本中使用这样的xpath。

    更新

    我试着添加这个代码来开始:

    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中,我试图编译脚本,但出现了以下错误:

    Log

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Andrew Truckle    7 年前

    我收到了软件作者的反馈:

    请注意helpndoc的脚本引擎只是pascal语言和库的一个子集。脚本语言中没有可用的XML库。 可以使用第三方XML库,但这不是我们测试或支持的东西。

    我们建议您使用更简单的结构,这些结构可以通过简单代码(如逗号分隔(CSV)文件)很容易地解析。

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

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

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

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

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

    更新

    值得一提的是,我通过使 TStringList 全局变量。然后我只将数据文件读入这个列表一次,并在创建元描述时使用它。最后,在脚本文件的构建过程快结束时释放列表。