Why does Saxon evaluate the result-document URI to be the same?

匿名 (未验证) 提交于 2019-12-03 01:06:02

问题:

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?

回答1:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!