2010-06-04 3 views
1

Мой XSL исходный документ выглядит следующим образомПочему Saxon оценивает URI результирующего документа так же?

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

Как мои сообщения показывают мне, что это, кажется, работает нормально - если саксонская не будет оценивать 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) 

Любые идеи о том, как это решить?

ответ

7

Вы определяете переменную $filename для @file, но не завернуть в {} так оценивает его как строку «$ имя_файла» каждый раз (который является тем же URI, таким образом, ошибка).

Вам необходимо его оценить как Attribute Value Template.

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

Почему я этого не понял? Большое вам спасибо за открытие моего слепого ума ;-) Хорошо: ссылка на AVT. – Jan

Смежные вопросы