加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Saxon在Altova XML中使用xsl:result-document的奇怪行为

发布时间:2020-12-16 23:29:31 所属栏目:百科 来源:网络整理
导读:我的输入文件: folders folder name="a" level="1" metadataFile="LVM20metadata.tsv" subfolder name="a/er" level="2" filter="no" / subfolder name="a/ir" level="2" filter="yes" / subfolder name="a/ar" level="2" filter="no" / subfolder name="a/
我的输入文件:

<folders>
    <folder name="a" level="1" metadataFile="LVM20metadata.tsv">
        <subfolder name="a/er" level="2" filter="no" />
        <subfolder name="a/ir" level="2" filter="yes" />
        <subfolder name="a/ar" level="2" filter="no" />
        <subfolder name="a/or" level="2" filter="yes" />
    </folder>
    <folder name="b" level="1" metadataFile="LVM21metadata.tsv">
        <subfolder name="b/er" level="2" filter="no" />
        <subfolder name="b/ir" level="2" filter="yes" />
        <subfolder name="b/ar" level="2" filter="no" />
        <subfolder name="b/or" level="2" filter="yes" />
    </folder>
</folders>

我的样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions " exclude-result-prefixes="fn xs">

    <xsl:template match="/">

        <xsl:apply-templates/>


    </xsl:template>

<xsl:template match="folders">
<xsl:apply-templates/>
</xsl:template> 

<xsl:template match="folder">
<xsl:result-document method="xml" standalone="yes" href="{@name}.xml">
<hello></hello>
</xsl:result-document>
</xsl:template>

</xsl:stylesheet>

它不会创建两个结果文档.这是为什么? (使用saxon9he)

这不应该创建两个名为a.xml和b.xml的XML文档吗?

解决方法

如果您从oXygen运行样式表,或者在您的Altova案例中运行样式表,那么这实际上是一个已知的功能(或者如果您愿意,可以使用bug).我不确定目前的版本是否还有这个“功能”,但它的工作原理如下:

>如果没有主要结果文档(即生成空序列)
>并且有一个辅助结果文档(即使用xsl:result-document)
>在用户界面中显示第一个此类结果文档
>正常创建任何其他结果文档

我相信这是因为这些工具使用某种UriResolver来重定向主要结果.如果没有输出,则不调用UriResolver,但随后由下一个辅助输出调用,从而导致此行为.这就是为什么这个文件最终出现在系统的临时文件位置的原因(你会发现那里的主要输出文件也有“正常”变换).

每当我遇到这种情况并且我不喜欢这种行为时,简单的解决方案就是创建一个虚拟的主要结果文档.在你的情况下,这可能是这样的:

<xsl:template match="/">
    <root>Primary result doc,please ignore,see other files.</root>
    <xsl:apply-templates/>
</xsl:template>

我相信有一个系统属性或环境变量可以用来询问它是否在UI中运行,或者在没有它的情况下,在调用命令行中添加一个设置静态参数的参数(不幸的是,这仅适用于在XSLT 3.0中,您可以在use-when中使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读