如何让我的 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】:
试试<xsl:variable name="atom-tags" select="document(document(//xml:mapref/@href)//xml:mapref/@href)"/>
。假设您以某种方式为前缀 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章