为什么 Saxon 评估结果文档 URI 是相同的?
我的 XSL 源文档如下所示
<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 作为结果文档的路径作为参数。
<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 评估为相同,从而给出以下输出。
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)
关于如何解决这个问题有什么想法吗?
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>
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>
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您正在为
@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.