如何让我的 XSLT 脚本深入了解 2 个文档并将数据编译成一个 HTML 文件?

Posted

技术标签:

【中文标题】如何让我的 XSLT 脚本深入了解 2 个文档并将数据编译成一个 HTML 文件?【英文标题】:How do I get my XSLT script to drill down 2 documents and compile the data into one HTML file? 【发布时间】:2021-12-18 04:26:55 【问题描述】:

我需要在一个 ditamap XML 文件上运行一个 XSLT 脚本,该文件从地图中深入研究 2 个子文件以收集 2 条数据。脚本不起作用,我不知道为什么。任何帮助将不胜感激。

这是我到目前为止编写的脚本,但它没有深入到我需要从中提取数据的文档。我需要深入到第一个 ditamap 上的 maps/sec_s63_midterm_u1.ditamap 和第二个 ditamap 上的 sec_s63_midterm_l1.ditamap

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:math="http://exslt.org/math"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:s9ml="http://www.standardnine.com/s9ml" exclude-result-prefixes="xs math xd xhtml s9ml"
    xmlns="http://www.w3.org/1999/xhtml" version="3.0">
    <xsl:template match="/">
        <xsl:variable name="maps" select="document(document(//mapref/@href)//mapref/@href)"/> 
        <xsl:for-each select="$maps">
        <html> 
            <body>
                <h2></h2>
                <table border="1">     
                    <xsl:apply-templates/>                
                </table>
            </body>
        </html>
        </xsl:for-each>
    </xsl:template>
    
    <xsl:template match="topicref">      
        <tr>
            <td><xsl:value-of select="tokenize(@href, '/')[last()]"/></td>
            <td><xsl:value-of select="topicsubject/@keyref"/></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

这是我需要在其上运行脚本的 XML 文件:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE bookmap PUBLIC "-//OASIS//DTD DITA BookMap//EN" "bookmap.dtd" []>
<bookmap>
    <frontmatter>
        <keydef keys="AssessmentInstruction" href="../assess_overviews/primary/s63_Midterm_Exam.dita"/>
    </frontmatter>
    
    <chapter href="../titles/sec_s63_title_u1.dita" locktitle="yes">
        <topicmeta>
            <navtitle>Unit 1: Definitions Under the Uniform Securities Act</navtitle>
        </topicmeta>
        <mapref href="maps/sec_s63_midterm_u1.ditamap" format="ditamap"/>
    </chapter>

    <chapter href="../titles/sec_s63_title_u2.dita" locktitle="yes">
        <topicmeta>
            <navtitle>Unit 2: Regulation of Broker-Dealers and Their Agents Under the Uniform
                Securities Act</navtitle>
        </topicmeta>
        <mapref href="maps/sec_s63_midterm_u2.ditamap" format="ditamap"/>
    </chapter>
</bookmap>

这是***地图链接到的第二个文件 (maps/sec_s63_midterm_u1.ditamap):

<?xml version='1.0' encoding='UTF-8'?>

  <!DOCTYPE map PUBLIC "-//KPE//DTD DITA KPE Map//EN" "kpe-map.dtd" []>
<map>
  <title>Unit 1: Definitions Under the Uniform Securities Act</title>
  <topicsubject format="ditamap" href="../../los/sec_s63_subjectscheme.ditamap"/>
    
  <topicref href="../../assess_overviews/primary/sec_s63_assessoverview_primary_l1.dita">
    <mapref href="sec_s63_midterm_l1.ditamap" format="ditamap"/>
  </topicref>  
</map>

这是我需要从 (sec_s63_midterm_l1.ditamap) 中提取数据的下一个链接 XML 文件:

<?xml version='1.0' encoding='UTF-8'?>

  <!DOCTYPE map PUBLIC "-//KPE//DTD DITA KPE Map//EN" "kpe-map.dtd" []>
<map>
  <title><ph conref="../../titles/sec_s63_title_l1.dita#sec_s63_title_l1/topic_title"/></title>
  
  <topicref href="../questions/sec_question_00260_1.dita">
    <topicsubject keyref="sec_s63_los_1"/>
  </topicref>
  
  <topicref href="../questions/sec_question_00260_2.dita">
    <topicsubject keyref="sec_s63_los_1"/>
  </topicref>
  
  <topicref href="../questions/sec_question_00260_3.dita">
    <topicsubject keyref="sec_s63_los_1"/>
  </topicref> 
</map>

【问题讨论】:

是 XSLT 1 还是 2? /xml:mapref 中的前缀来自哪里,我没有看到它声明。如果(第一个)输入文档以 bookmap 为根,match="map" 的元素在哪里? 【参考方案1】:

试试&lt;xsl:variable name="atom-tags" select="document(document(//xml:mapref/@href)//xml:mapref/@href)"/&gt;。假设您以某种方式为前缀 xml 声明了正确的命名空间。 xsl:for-each select="//topicref" 是否会选择某些内容还取决于 topicref 元素是否不在命名空间中,或者您在 XSLT 2/3 中为它们的命名空间设置了 xpath-default-namespace

【讨论】:

非常感谢您的回复。我调整了 XSLT 脚本,但仍然没有输出任何数据。我更新的脚本在上面的原始帖子中。知道为什么我仍然没有运气吗? @pantherfan,正如我在对您的问题的评论中所说,如果 XSLT 没有,则 XSLT/XPath 中的 xml:mapref 只会给出关于前缀 xml 未绑定的错误任何 xmlns:mapref="..." 命名空间声明。 @pantherfan,以及match="topicref" 是否可以匹配任何东西也不清楚您的 sn-ps,我猜引用的 DITA DTD 为所有元素设置了一些命名空间声明属性,因此您的 XSLT 需要使用xpath-default-namespace 用于相关的命名空间。 我搞定了。我将正在运行的脚本添加到我的原始帖子中。感谢大家的帮助!!

以上是关于如何让我的 XSLT 脚本深入了解 2 个文档并将数据编译成一个 HTML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 xslt 中添加空格并将记录限制为 300 个字符

维护嵌套元素的分组方法 XSLT 2.0 - 分离多余的

XSLT 如何组合模板并将现有字段添加到某些元素

XSLT如何仅对XML文档的字符串节点中的数值进行排序

为啥我的标签在 XSLT 转换后展开(以及如何修复)?

用 Java 处理 XSLT?