Html XSL爬网文件列表并从特定元素编译定义列表
我有一组文件,其中包含我想要编译成单个列表的定义。文件列表存储在如下所示的XML文件中(这是输入文件): 每个文件中的最后一项都正确呈现,但这只是因为没有更多的后续节点要处理。我的代码中有太多的节点与键匹配Html XSL爬网文件列表并从特定元素编译定义列表,html,xslt,xpath,dita,Html,Xslt,Xpath,Dita,我有一组文件,其中包含我想要编译成单个列表的定义。文件列表存储在如下所示的XML文件中(这是输入文件): 每个文件中的最后一项都正确呈现,但这只是因为没有更多的后续节点要处理。我的代码中有太多的节点与键匹配 谢谢查看。我会稍微更改密钥定义: <xsl:key name="kFollowing" match="*[not(self::p[@class='Term'])][preceding-sibling::p[@class='Term']" use="generate-i
谢谢查看。我会稍微更改密钥定义:
<xsl:key name="kFollowing"
match="*[not(self::p[@class='Term'])][preceding-sibling::p[@class='Term']"
use="generate-id(preceding-sibling::p[@class='Term'][1])"/>
这将匹配本身不是
但在树中与该元素处于同一级别的任何元素,并按其最近的前一个“Term”对这些元素进行分组。如果要考虑以下情况,即
后面的内容只是文本节点(即,不在任何元素内),则需要
<xsl:key name="kFollowing"
match="node()[not(self::p[@class='Term'])][preceding-sibling::p[@class='Term']"
use="generate-id(preceding-sibling::p[@class='Term'][1])"/>
然后,您可以简化每个的内部
<xsl:for-each select="document(.)/descendant::p[@class='Term']">
<dlentry id="{a/@id}">
<dt><xsl:value-of select="."/></dt>
<dd><xsl:copy-of select="key('kFollowing', generate-id())"/></dd>
</dlentry>
</xsl:for-each>
谢谢你,伊恩!这确实奏效了。我仍然需要改进
中的键处理,因为它从html中获取了一些在我的目标格式(DITA)中无效的
(和其他元素),但这相当简单。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*" />
<xsl:key name="kFollowing" match="*[not(p[@class='Term'])]"
use="generate-id(preceding::p[@class='Term'][1])"/>
<xsl:template match="/">
<![CDATA[
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd"> ]]>
<topic id="data_dictionary">
<title>IBS Insight Data Dictionary</title>
<body>
<dl>
<xsl:for-each select="/report/incident/file">
<xsl:for-each select="document(.)/descendant::p[@class='Term']">
<xsl:variable name="vFollowing" select="key('kFollowing', generate-id())"/>
<xsl:element name="dlentry">
<xsl:attribute name="id">
<xsl:value-of select="child::a/@id"/>
</xsl:attribute>
<dt><xsl:value-of select="."/></dt>
<dd><xsl:value-of select="$vFollowing"/>
<xsl:for-each select="following::*[$vFollowing]">
<xsl:apply-templates select="."/>
</xsl:for-each>
</dd>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</dl></body></topic>
</xsl:template>
</xsl:stylesheet>
<topic>
<title>Arbitrary title</title>
<body>
<dl>
<dlentry id="Accrued_Bonus_Interest">
<dt>Accrued (Bonus Interest)</dt>
<dd>Bonus Interest Accrued Cycle-to-Date.  Amount of bonus interest that has accrued on the time deposit. Pages: View CD DetailAccrued (Original Issue Amount)Original Issue Discount Interest Accrued Year-to-Date.  OID interest accrued in the current year.Pages: View CD Detail</dd></dlentry>
<dlentry id="Accrued_OID">
<dt>Accrued (Original Issue Amount)</dt>
<dd><p>Original Issue Discount Interest Accrued Year-to-Date.  OID interest accrued in the current year.</p>
<p>Pages: View CD Detail</p></dd>
</dl>
</body>
</topic>
<xsl:key name="kFollowing"
match="*[not(self::p[@class='Term'])][preceding-sibling::p[@class='Term']"
use="generate-id(preceding-sibling::p[@class='Term'][1])"/>
<xsl:key name="kFollowing"
match="node()[not(self::p[@class='Term'])][preceding-sibling::p[@class='Term']"
use="generate-id(preceding-sibling::p[@class='Term'][1])"/>
<xsl:for-each select="document(.)/descendant::p[@class='Term']">
<dlentry id="{a/@id}">
<dt><xsl:value-of select="."/></dt>
<dd><xsl:copy-of select="key('kFollowing', generate-id())"/></dd>
</dlentry>
</xsl:for-each>