使用此源XML:
<?xml version='1.0' encoding='UTF-8'?>
<ns:Report_Data xmlns:ns="urn:someURN">
<ns:Report_Entry>
<ns:ReportName>SomeReportName</ns:ReportName>
<ns:ReportComments>Some description for this report....</ns:ReportComments>
<ns:AreaWhereUsed Descriptor="ThisIsATransform">
<ns:ID type="GUID">SomeUniqueID</ns:ID>
<ns:ID type="Component_ID">CUSTOM_COMPONENT</ns:ID>
</ns:AreaWhereUsed>
<ns:AreaWhereUsed Descriptor="SomeProcessName">
<ns:ID type="GUID">SomeDifferentUniqueID</ns:ID>
<ns:ID type="Process_ID">SomeProcessName</ns:ID>
</ns:AreaWhereUsed>
<ns:Area_Where_Used/>
<ns:Area_Where_Used>
<ns:AWU_Comment>This is some process description</ns:AWU_Comment>
</ns:Area_Where_Used>
<ns:CFs>
<ns:CF>SomeCF</ns:CF>
</ns:CFs>
</ns:Report_Entry>
</ns:Report_Data>
我正在尝试将其转换为一组文本文档。每个&#34;报告条目的一个文件。&#34;
当我使用这个XSL时:
<?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:ns="urn:someURN"
exclude-result-prefixes="xs" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:variable name="delimiter" select="'	'"/>
<xsl:variable name="quote" select="'"'"/>
<xsl:variable name="linefeed" select="'
'"/>
<xsl:template match="/">
<!-- Data Row Begins -->
<xsl:for-each select="/ns:Report_Data/ns:Report_Entry">
<xsl:text>Text and various other stuffs</xsl:text>
</xsl:for-each>
<!-- Data Row End -->
</xsl:template>
</xsl:stylesheet>
输出是单行文本,我大多期望。
但是,当我添加result-document
标记时,如下所示:
<?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:ns="urn:someURN"
exclude-result-prefixes="xs" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:variable name="delimiter" select="'	'"/>
<xsl:variable name="quote" select="'"'"/>
<xsl:variable name="linefeed" select="'
'"/>
<xsl:template match="/">
<!-- Data Row Begins -->
<xsl:for-each select="/ns:Report_Data/ns:Report_Entry">
<xsl:result-document method="text" href="file_{@ns:ReportName}-output.txt">
<xsl:text>Text and various other stuffs</xsl:text>
</xsl:result-document>
</xsl:for-each>
<!-- Data Row End -->
</xsl:template>
</xsl:stylesheet>
我收到错误:Error: Internal error evaluating template rule at line 10 in module
引用了模板行:<xsl:template match="/">
我正在使用网站http://xslttest.appspot.com/来测试我的转换。
我还是XSL的新手,所以我不太了解模板和apply-template标签的功能。我很感激关于模板标签如何与结果文档标签交互的任何指示。
(注意,我对代码进行了大量清理,但它的运行方式如上所述)。
谢谢!
答案 0 :(得分:0)
首先,<xsl:for-each select="/Report_Data/Report_Entry">
中的xpath中没有使用名称空间前缀,但输入xml有它。所以我怀疑你的转型会产生任何结果
您可以为命名空间urn:(someURN)
指定前缀,并且必须对xpath中的元素使用相同的前缀
例如。,
xmlns:ns="urn:(someURN)"
<xsl:for-each select="/ns:Report_Data/ns:Report_Entry">
使用xsl:result-document
时可能会出现使用网站(外部资源)的问题,因为此指令会指示处理器编写本地文件,这可能是不可能的。
我建议你使用本地处理器并尝试转换。
答案 1 :(得分:0)
消息
错误:评估模板规则的内部错误
经常表明萨克森内部的一个内部错误应该报告给Saxonica。但是,它可能是从“回调”方法触发的,例如OutputURIResolver。例如,可以想象实现此在线服务的人将使用OutputURIResolver,在调用xsl:result-document时无条件地抛出异常(尽管有更简洁的方法配置Saxon以达到相同的效果)。
所以我建议,只有你能在自己的环境中重现它并且确切知道Saxon的配置方式,才能向Saxonica报告。