本文介绍了片段输入xhtml以将xhtml文件与祖先节点deails分开的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以帮我解决这个问题吗?真的很感激.

要求:

  1. 要为每个 pal:fragment 元素生成单独的 html 文件,例如附加的源文件,文件的名称基于@fragment-id 出现在 pal:fragment 元素上.
  2. 'pal:fragment' 可以嵌套,用 'div' 元素包裹.
  3. 碎片化的文件不仅应该包含 pal:fragment 的所有子元素,但也应该包括它的祖先 'div' 元素.从 'pal:fragment' 生成的每个单独的文件不应包含其后代 'pal:fragment 内容的内容.

请参阅以下示例以了解需求

example1:如果为'pal:fragment'fragment-id="DLM3989039"生成了一个片段文件,内容应该是这样的(删除了html标记以便于理解)

<div class="schedule-group"><div class="schedule" id="DLM3989039"><p>DLM3989039 虚拟文本 </p><div class="schedule-provisions"></div>

示例 2:如果为 'pal:fragment' fragment-id="DLM3989044" 生成片段文件,则内容应如下所示.(删除了 html 标记以便于理解)

<div class="schedule-group"><div class="schedule" id="DLM3989039"><div class="schedule-provisions"><div class="part" id="DLM3989044"><p>DLM3989044 虚拟内容</p>

我用过

</pal:fragment>

<pal:fragment fragment-id="DLM3988906" fragment-type="contents"><div class="cover" id="DLM3988906"><p>DLM3988906 虚拟文本</p>

<div class="body" id="DLM3988910"><pal:fragment fragment-id="DLM3988963" fragment-type="part"><div class="part" id="DLM3988963"><p>DLM3988963 虚拟文本</p><pal:fragment fragment-id="DLM3988965" fragment-type="prov"><div class="prov" id="DLM3988965"><p>DLM3988965 虚拟文本</p>

</pal:fragment>

</pal:fragment><pal:fragment fragment-id="DLM3989003" fragment-type="part"><div class="part" id="DLM3989003"><p>DLM3989003 虚拟文本</p><pal:fragment fragment-id="DLM3989004" fragment-type="subpart"><div class="subpart" id="DLM3989004"><p>DLM3989004 虚拟文本</p><pal:fragment fragment-id="DLM3989005" fragment-type="prov"><div class="prov" id="DLM3989005"><p>DLM3989005 虚拟文本</p>

</pal:fragment>

</pal:fragment>

</pal:fragment>

</pal:fragment><div class="schedule-group"><pal:fragment fragment-id="DLM3989039" fragment-type="schedule"><div class="schedule" id="DLM3989039"><p>DLM3989039 虚拟文本 </p><div class="schedule-provisions"><pal:fragment fragment-id="DLM3989044" fragment-type="part"><div class="part" id="DLM3989044"><p>DLM3989044 虚拟内容</p><pal:fragment fragment-id="DLM3989057" fragment-type="subpart"><div class="subpart" id="DLM3989057"><p>DLM3989057 虚拟内容</p><pal:fragment fragment-id="DLM3989059" fragment-type="prov"><div class="prov" id="DLM3989059"><p>DLM3989059 虚拟系数</p>

</pal:fragment>

</pal:fragment>

</pal:fragment>

</pal:fragment>

==============

我创建的 XSLT 样式表:

<xsl:param name="output_dir" as="xs:anyURI"><xsl:when test="$target_directory = ''"><xsl:value-of select="$input_doc_loc"/></xsl:when><xsl:否则><xsl:value-of select="concat($target_directory, '/')"/></xsl:否则></xsl:选择></xsl:param><xsl:param name="input_file_name" as="xs:anyURI"><xsl:变量名=文件名"><xsl:call-template name="get_file_name"><xsl:with-param name="file_name" select="document-uri(/)" as="xs:anyURI"/></xsl:call-template></xsl:变量><xsl:value-of select="$filename"/></xsl:param><xsl:template name="get_file_name"><xsl:param name="file_name" as="xs:anyURI"/><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:否则><xsl:value-of select="$file_name"/></xsl:否则></xsl:选择></xsl:模板><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:变量><xsl:variable name="reverse-ancestor-divs" as="node()*"><xsl:sequence select="reverse($ancestor-divs)"/></xsl:变量><xsl:result-document href="{$fragment_file}"><html <身体><xsl:sequence select="$ancestor-divs"/></html></xsl:result-document></xsl:模板><xsl:template match="foo:fragment"><xsl:call-template name="generate_output_doc"/></xsl:模板><xsl:template match="html:div"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:模板><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:模板><!-- 标准身份模板--><xsl:template match="*| @*"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:模板></xsl:stylesheet>

============

虽然使用上面附带/提到的示例文件,生成的单独 html 文件的数量为11",这(文件数量)符合预期.我的 XSLT 样式表有问题.生成的输出看起来像这样(下面的mentioend):

  1. 'foo:fragment' 的祖先节点没有正确嵌套,并且不包括片段内容作为它的子/后代,而是写为兄弟.

获取由DLM3989039"'pal:fragment'元素生成的html单独文件

<身体><div class="schedule-group"><div class="bill" id="DLM3988900"></div>

<div

</html>

谢谢和问候,苏雷什.

解决方案

我不确定我是否完全理解您的要求,但这是我相信您想要实现的目标:

<身体><xsl:apply-templates select="ancestor::html:div[last()]"><xsl:with-param name="doc-frag" as="element(pal:fragment)" select="current()" tunnel="yes"/></xsl:apply-templates></html></xsl:result-document></xsl:模板><xsl:template match="@* | node()"><xsl:copy><xsl:apply-templates select="@* , node()"/></xsl:copy></xsl:模板><xsl:template match="html:*"><xsl:param name="doc-frag" as="element(pal:fragment)" tunnel="yes"/><xsl:variable name="doc-anc" as="element()*" select="$doc-frag/ancestor-or-self::*"/><xsl:when test="$doc-anc[. is current()]"><xsl:element name="{name()}"><xsl:apply-templates select="@* , *[descendant-or-self::*[. is $doc-frag]]"/></xsl:element></xsl:when><xsl:when test="ancestor::pal:fragment[. is $doc-frag]"><xsl:element name="{name()}"><xsl:apply-templates select="@* , node()"/></xsl:element></xsl:when></xsl:选择></xsl:模板><xsl:template match="pal:fragment"><xsl:param name="doc-frag" as="element(pal:fragment)" tunnel="yes"/><xsl:if test="$doc-frag/ancestor-or-self::pal:fragment[. is current()]"><xsl:apply-templates/></xsl:if></xsl:模板></xsl:stylesheet>

当我将带有 Saxon 9.4 HE 的样式表应用于输入时

</pal:fragment>

<pal:fragment fragment-id="DLM3988906" fragment-type="contents"><div class="cover" id="DLM3988906"><p>DLM3988906 虚拟文本</p>

<div class="body" id="DLM3988910"><pal:fragment fragment-id="DLM3988963" fragment-type="part"><div class="part" id="DLM3988963"><p>DLM3988963 虚拟文本</p><pal:fragment fragment-id="DLM3988965" fragment-type="prov"><div class="prov" id="DLM3988965"><p>DLM3988965 虚拟文本</p>

</pal:fragment>

</pal:fragment><pal:fragment fragment-id="DLM3989003" fragment-type="part"><div class="part" id="DLM3989003"><p>DLM3989003 虚拟文本</p><pal:fragment fragment-id="DLM3989004" fragment-type="subpart"><div class="subpart" id="DLM3989004"><p>DLM3989004 虚拟文本</p><pal:fragment fragment-id="DLM3989005" fragment-type="prov"><div class="prov" id="DLM3989005"><p>DLM3989005 虚拟文本</p>

</pal:fragment>

</pal:fragment>

</pal:fragment>

</pal:fragment><div class="schedule-group"><pal:fragment fragment-id="DLM3989039" fragment-type="schedule"><div class="schedule" id="DLM3989039"><p>DLM3989039 虚拟文本 </p><div class="schedule-provisions"><pal:fragment fragment-id="DLM3989044" fragment-type="part"><div class="part" id="DLM3989044"><p>DLM3989044 虚拟内容</p><pal:fragment fragment-id="DLM3989057" fragment-type="subpart"><div class="subpart" id="DLM3989057"><p>DLM3989057 虚拟内容</p><pal:fragment fragment-id="DLM3989059" fragment-type="prov"><div class="prov" id="DLM3989059"><p>DLM3989059 虚拟系数</p>

</pal:fragment>

</pal:fragment>

</pal:fragment>

</pal:fragment>

我得到 11 个 DMLxxx.html 结果文件

Mode LastWriteTime Length Name---- ------------- ------ -----a--- 24.10.2012 11:38 387 DLM3988901.html-a--- 24.10.2012 11:38 375 DLM3988906.html-a--- 24.10.2012 11:38 393 DLM3988963.html-a--- 24.10.2012 11:38 468 DLM3988965.html-a--- 24.10.2012 11:38 393 DLM3989003.html-a--- 24.10.2012 11:38 471 DLM3989004.html-a--- 24.10.2012 11:38 552 DLM3989005.html-a--- 24.10.2012 11:38 447 DLM3989039.html-a--- 24.10.2012 11:38 549 DLM3989044.html-a--- 24.10.2012 11:38 639 DLM3989057.html-a--- 24.10.2012 11:38 731 DLM3989059.html

例如DLM3988901.html

<身体><div class="bill" id="DLM3988900"><div class="billdetail"><div class="explnote" id="DLM3988901"><p>DLM3988901 虚拟文本</p>

</html>

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 虚拟内容</p>

</html>

Can someone help me on this. Really appreciated.

Requirement:

  1. To generate separate html files for each pal:fragment element, forthe source document attached ,the files gets name based on@fragment-id which is present on the pal:fragment elements.
  2. The 'pal:fragment' can be nested, wrapped with 'div' element.
  3. The fragmented file not only should include all child elements of pal:fragment, but also should include its ancestor 'div' element.Each separate file generated from 'pal:fragment' should not includethe content of its descendant 'pal:fragment content.

See below examples for requirement understanding

example1: if a fragment file is generated for 'pal:fragment' fragment-id="DLM3989039", the content should look like this (removed html markup for easy understanding)

<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>

example 2: if a fragment file is generated for 'pal:fragment' fragment-id="DLM3989044", the content should look like this. (removed html markup for easy understanding)

<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>      

I used

<?

=============

XSLT stylesheet I created:

<?

============

Though using the sample file attached/mentioned above, number of separate html files generated are "11", which(the number of files) is as expected.There are Problems with my XSLT stylesheet. The generated output looks like this(mentioend below ):

  1. ancestor nodes for a 'foo:fragment' are not nested properly and does not include the fragment-content as it child/descendant, instead writing as sibling.

Took generated html separate file produced by "DLM3989039" 'pal:fragment' element

<html 

Thanks and Regards,Suresh.

解决方案

I am not sure I completely understand your requirement but here is my implementation of what I believe you want to achieve:

<?

When I apply that stylesheet with Saxon 9.4 HE to the input

<?

I get 11 DMLxxx.html result files

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        24.10.2012     11:38        387 DLM3988901.html
-a---        24.10.2012     11:38        375 DLM3988906.html
-a---        24.10.2012     11:38        393 DLM3988963.html
-a---        24.10.2012     11:38        468 DLM3988965.html
-a---        24.10.2012     11:38        393 DLM3989003.html
-a---        24.10.2012     11:38        471 DLM3989004.html
-a---        24.10.2012     11:38        552 DLM3989005.html
-a---        24.10.2012     11:38        447 DLM3989039.html
-a---        24.10.2012     11:38        549 DLM3989044.html
-a---        24.10.2012     11:38        639 DLM3989057.html
-a---        24.10.2012     11:38        731 DLM3989059.html

where for instance DLM3988901.html is

<html 

and DLM3989044.html is

<html 

这篇关于片段输入xhtml以将xhtml文件与祖先节点deails分开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-01 10:29