为什么 Saxon 将结果文档 URI 评估为相同? [英] Why does Saxon evaluate the result-document URI to be the same?

查看:52
本文介绍了为什么 Saxon 将结果文档 URI 评估为相同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 XSL 源文件是这样的

My XSL source document looks like this

<Topology>
<Environment>
    <Id>test</Id>
    <Machines>
        <Machine>
            <Id>machine1</Id>
            <modules>
                <module>m1</module>
                <module>m2</module>
            </modules>
        </Machine>
    </Machines>
</Environment>
<Environment>
    <Id>production</Id>
    <Machines>
        <Machine>
            <Id>machine1</Id>
            <modules>
                <module>m1</module>
                <module>m2</module>
            </modules>
        </Machine>
        <Machine>
            <Id>machine2</Id>
            <modules>
                <module>m3</module>
                <module>m4</module>
            </modules>
        </Machine>
    </Machines>
</Environment>
</Topology>

我想为每台机器创建一个结果文档,因此我使用以下样式表,将 modelDir 作为结果文档的路径作为参数.

I want to create one result-document per machine, so I use the following stylesheet giving modelDir as path for the result-documents as parameter.

<xsl:output method="xml" version="1.0" encoding="UTF-8" 
            indent="yes" name="myXML" doctype-system="http://java.sun.com/dtd/properties.dtd"/>

<xsl:template match="/">
    <xsl:for-each-group select="/Topology/Environment/Machines/Machine" group-by="Id">

        <xsl:variable name="machine" select="Id"/>
        <xsl:variable name="filename" select="concat($modelDir,$machine,'.xml')" />

        <xsl:message terminate="no">Writing machine description to <xsl:value-of select="$filename"/></xsl:message>

        <xsl:result-document href="$filename" format="myXML">

            <xsl:variable name="currentMachine" select="Id"/>
            <xsl:for-each select="current-group()/LogicalHosts/LogicalHost">
                <xsl:variable name="environment" select="normalize-space(../../../../Id)"/>
                <xsl:message terminate="no">Module <xsl:value-of select="."/> for <xsl:value-of select="$environment"/></xsl:message>
            </xsl:for-each>

        </xsl:result-document>

     </xsl:for-each-group>
</xsl:template>

正如我的消息向我展示的那样,这似乎工作正常 - 如果 saxon 不会将结果文档的 URI 评估为相同,从而给出以下输出.

As my messages show me this seems to work fine - if saxon would not evaluate the URI of the result-document to be the same and thus give the following output.

Writing machine description to target/build/model/m1.xml
Module m1 for test
Module m2 for test
Module m1 for production
Module m2 for production
Writing machine description to target/build/model/m2.xml
Error at xsl:result-document on line 29 of file:/C:/Projekte/.../machine.xsl:
  XTDE1490: Cannot write more than one result document to the same URI, or write to a URI
  that has been read:
  file:/C:/Projekte/.../$filename
file:/C:/Projekte/.../machine.xsl(29,-1) : here Cannot write more than one result document to the same URI, or write to a URI that has been read: file:/C:/Projekte/.../$filename
; SystemID: file:/C:/Projekte/.../machine.xsl; Line#: 29; Column#: -1
net.sf.saxon.trans.DynamicError: Cannot write more than one result document to the same URI, or write to a URI that has been read: file:/C:/Projekte/.../$filename
    at net.sf.saxon.instruct.ResultDocument.processLeavingTail(ResultDocument.java:300)
    at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:365)
    at net.sf.saxon.instruct.Instruction.process(Instruction.java:91)

关于如何解决这个问题的任何想法?

Any ideas on how to solve this?

推荐答案

您正在为 @file 指定一个变量 $filename,但没有包含在 中>{}所以它每次都将它评估为字符串$filename"(这是相同的 URI,因此是错误).

You are specifying a variable $filename for the @file, but did not wrap in {}so it is evaluating it as the string "$filename" every time(which is the same URI, thus the error).

您需要将其评估为属性值模板.

You need it to evaluate as an Attribute Value Template.

<xsl:result-document href="{$filename}" format="myXML">

这篇关于为什么 Saxon 将结果文档 URI 评估为相同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆