有人可以帮我解决这个问题。非常感谢。
要求:
- 要为每个 pal:fragment 元素生成单独的 html 文件,对于附加的源文档,文件的名称基于 pal:fragment 元素上的@fragment-id。
- 'pal:fragment' 可以嵌套,用 'div' 元素包裹。
- 分片文件不仅应包含 pal:fragment 的所有子元素,还应包含其祖先 'div' 元素。从 'pal:fragment' 生成的每个单独文件不应包含其后代 'pal:fragment 内容的内容。
请参阅以下示例以了解需求
示例 1:如果为 'pal:fragment' fragment-id="DLM3989039" 生成片段文件,内容应如下所示(删除 html 标记以便于理解)
<div class="bill" id="DLM3988900">
<div class="schedule-group">
<div class="schedule" id="DLM3989039">
<p>DLM3989039 dummy text </p>
<div class="schedule-provisions"></div>
</div>
</div>
</div>
示例 2:如果为 'pal:fragment' fragment-id="DLM3989044" 生成片段文件,则内容应如下所示。(为了便于理解,去掉了 html 标记)
<div class="bill" id="DLM3988900">
<div class="schedule-group">
<div class="schedule" id="DLM3989039">
<div class="schedule-provisions">
<div class="part" id="DLM3989044">
<p>DLM3989044 dummy content</p>
</div>
</div>
</div>
</div>
</div>
我使用的XML 文档
<?xml version="1.0" encoding="UTF-8"?>
<div class="bill" id="DLM3988900" xmlns:pal="http://www.google.nz/rendition-info"
xmlns="http://www.w3.org/1999/xhtml">
<div class="billdetail">
<pal:fragment fragment-id="DLM3988901" fragment-type="explnote">
<div class="explnote" id="DLM3988901">
<p>DLM3988901 dummy text</p>
</div>
</pal:fragment>
</div>
<pal:fragment fragment-id="DLM3988906" fragment-type="contents">
<div class="cover" id="DLM3988906">
<p>DLM3988906 dummy text</p>
</div>
<div class="body" id="DLM3988910">
<pal:fragment fragment-id="DLM3988963" fragment-type="part">
<div class="part" id="DLM3988963">
<p>DLM3988963 dummy text</p>
<pal:fragment fragment-id="DLM3988965" fragment-type="prov">
<div class="prov" id="DLM3988965">
<p>DLM3988965 dummy text</p>
</div>
</pal:fragment>
</div>
</pal:fragment>
<pal:fragment fragment-id="DLM3989003" fragment-type="part">
<div class="part" id="DLM3989003">
<p>DLM3989003 dummy text</p>
<pal:fragment fragment-id="DLM3989004" fragment-type="subpart">
<div class="subpart" id="DLM3989004">
<p>DLM3989004 dummy text</p>
<pal:fragment fragment-id="DLM3989005" fragment-type="prov">
<div class="prov" id="DLM3989005">
<p>DLM3989005 dummy text</p>
</div>
</pal:fragment>
</div>
</pal:fragment>
</div>
</pal:fragment>
</div>
</pal:fragment>
<div class="schedule-group">
<pal:fragment fragment-id="DLM3989039" fragment-type="schedule">
<div class="schedule" id="DLM3989039">
<p>DLM3989039 dummy text </p>
<div class="schedule-provisions">
<pal:fragment fragment-id="DLM3989044" fragment-type="part">
<div class="part" id="DLM3989044">
<p>DLM3989044 dummy content</p>
<pal:fragment fragment-id="DLM3989057" fragment-type="subpart">
<div class="subpart" id="DLM3989057">
<p>DLM3989057 dummy content</p>
<pal:fragment fragment-id="DLM3989059" fragment-type="prov">
<div class="prov" id="DLM3989059">
<p> DLM3989059 dummy coent</p>
</div>
</pal:fragment>
</div>
</pal:fragment>
</div>
</pal:fragment>
</div>
</div>
</pal:fragment>
</div>
</div>
==============
我创建的 XSLT 样式表:
<?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:foo="http://www.google.nz/rendition-info"
xmlns:html="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xs foo html" version="2.0">
<xsl:strip-space elements="*"/>
<xsl:param name="target_directory" select="''" as="xs:string"/>
<xsl:param name="input_doc_loc"
select="xs:anyURI(substring-before(document-uri(/),$input_file_name))" as="xs:anyURI"/>
<xsl:param name="output_dir" as="xs:anyURI">
<xsl:choose>
<xsl:when test="$target_directory = ''">
<xsl:value-of select="$input_doc_loc"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($target_directory, '/')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:param>
<xsl:param name="input_file_name" as="xs:anyURI">
<xsl:variable name="filename">
<xsl:call-template name="get_file_name">
<xsl:with-param name="file_name" select="document-uri(/)" as="xs:anyURI"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$filename"/>
</xsl:param>
<xsl:template name="get_file_name">
<xsl:param name="file_name" as="xs:anyURI"/>
<xsl:choose>
<xsl:when test="contains($file_name, '/')">
<xsl:call-template name="get_file_name">
<xsl:with-param name="file_name"
select="xs:anyURI(substring-after($file_name, '/'))"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$file_name"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:param name="frag_file_ext" select="'.html'" as="xs:string"/>
<xsl:output media-type="text/html" method="html"/>
<xsl:template name="generate_output_doc">
<xsl:variable name="fragment_name" as="xs:anyURI"
select="xs:anyURI(concat(@fragment-id,$frag_file_ext))"/>
<xsl:variable name="fragment_file" as="xs:anyURI"
select="xs:anyURI(concat($output_dir,$fragment_name))"/>
<xsl:variable name="child-content" select="node()"/>
<xsl:variable name="ancestor-divs" as="node()*">
<xsl:apply-templates select="parent::html:div[1]" mode="div-content"/>
<xsl:apply-templates select="node()"/>
</xsl:variable>
<xsl:variable name="reverse-ancestor-divs" as="node()*">
<xsl:sequence select="reverse($ancestor-divs)"/>
</xsl:variable>
<xsl:result-document href="{$fragment_file}">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<xsl:sequence select="$ancestor-divs"/>
</body>
</html>
</xsl:result-document>
</xsl:template>
<xsl:template match="foo:fragment">
<xsl:call-template name="generate_output_doc"/>
</xsl:template>
<xsl:template match="html:div">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="html:div" mode="div-content">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="ancestor::html:div[1]" mode="div-content"/>
</xsl:copy>
</xsl:template>
<!-- The standard identity template -->
<xsl:template match="*| @*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
=============
虽然使用上面附加/提到的示例文件,但生成的单独 html 文件的数量为“11”,这(文件数量)符合预期。我的 XSLT 样式表有问题。生成的输出如下所示(以下提及):
- 'foo:fragment' 的祖先节点未正确嵌套,并且不包含片段内容作为其子/后代,而是作为兄弟节点写入。
获取由“DLM3989039”“pal:fragment”元素生成的 html 单独文件
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
</head>
<body>
<div class="schedule-group">
<div class="bill" id="DLM3988900"></div>
</div>
<div xmlns:foo="http://www.google.nz/rendition-info" class="schedule" id="DLM3989039">
<p>DLM3989039 dummy text </p>
<div class="schedule-provisions"></div>
</div>
</body>
</html>
谢谢和问候,苏雷什。