pices: Zähler einsetzen

meine owl Datei "dir.owl" sieht so aus.:~~~xml

<bp:model xmlns:bp="http://www.avt.rwth-aachen.de/batchPlus" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:wpml="http://www.avt.rwth-aachen.de/ontologies/wpml.owl#">
<bp:Step bp:id="1" rdf:id="#WP2">
<unitProcedure bp:id="1" bp:up="1" rdf:id="#WP3">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Befuellen</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="5" bp:op="1" rdf:id="#WP3">
<label>Reaktor mit 100 Kg Ethanol Befuellen
</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="6" bp:op="2" rdf:id="#WP3">
<label>Aufheizen bis 50°c176;C</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="7" bp:op="3" rdf:id="#WP3">
<label>50 kg A und 80 Kg B in Reaktor vorlegen</label>
</operation>
</unitProcedure>
<unitProcedure bp:id="2" bp:up="2" rdf:id="#WP4">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Reaktion</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="8" bp:op="1" rdf:id="#WP4">
<label>Reaktion</label>
</operation>
</unitProcedure>
<unitProcedure bp:id="3" bp:up="3" rdf:id="#WP5">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Produktaufbereitung(Filtern)</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="9" bp:op="1" rdf:id="#WP5">
<label>Reaktorinhalt filtern; 100% S trennen</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="10" bp:op="2" rdf:id="#WP5">
<label>FiltrenKuchen 4* waschen mit insgesamt 400 Kg wasser</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="11" bp:op="3" rdf:id="#WP5">
<label>Trockne filternkuchen bei 80°c, 800 mbar</label>
</operation>
</unitProcedure>
<unitProcedure bp:id="4" bp:up="4" rdf:id="#WP6">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Aufarbeitung</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="12" bp:op="1" rdf:id="#WP6">
<label>Destillation der Abwasser aus Filtration(95%; Ethanol Rueckgewinnung)</label>
</operation>
</unitProcedure>
</bp:Step>
<bp:Step bp:id="2" rdf:id="#AKP2">
<unitProcedure bp:id="40" bp:up="1" rdf:id="#WP3">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Befuellen</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="5" bp:op="1" rdf:id="#WP3">
<label>Reaktor mit 100 Kg Ethanol Befuellen
</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="6" bp:op="2" rdf:id="#WP3">
<label>Aufheizen bis 50°c176;C</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="7" bp:op="3" rdf:id="#WP3">
<label>50 kg A und 80 Kg B in Reaktor vorlegen</label>
</operation>
</unitProcedure>
<unitProcedure bp:id="41" bp:up="2" rdf:id="#WP4">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Reaktion</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="8" bp:op="1" rdf:id="#WP4">
<label>Reaktion</label>
</operation>
</unitProcedure>
<unitProcedure bp:id="42" bp:up="3" rdf:id="#WP5">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Produktaufbereitung(Filtern)</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="9" bp:op="1" rdf:id="#WP5">
<label>Reaktorinhalt filtern; 100% S trennen</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="10" bp:op="2" rdf:id="#WP5">
<label>FiltrenKuchen 4* waschen mit insgesamt 400 Kg wasser</label>
</operation>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="11" bp:op="3" rdf:id="#WP5">
<label>Trockne filternkuchen bei 80°c, 800 mbar</label>
</operation>
</unitProcedure>
<unitProcedure bp:id="43" bp:up="4" rdf:id="#WP6">
<label xmlns:owl="http://www.w3.org/2002/07/owl#">Aufarbeitung</label>
<operation xmlns:owl="http://www.w3.org/2002/07/owl#" bp:id="12" bp:op="1" rdf:id="#WP6">
<label>Destillation der Abwasser aus Filtration(95%; Ethanol Rueckgewinnung)</label>
</operation>
</unitProcedure>
</bp:Step>
</bp:model>

Ich möchte diese Datei transformieren so, dass ich die gleiche bekomme aber mit immer eine unterschiedliche "bp:id" egal die stufe, wo man sich befindet.  
Mit generated-id().bekomme ich keine Zahl, geht nicht. Ich habe gehört, dass es mit einen Zähler mit rekursivem Templateaufruf gehen kann oder die mit der Funktion "saxon:assign". Habe versucht, funktioniert bei mir nicht. Vielleicht aber ich nicht richtig eingesetzt.  
  
Kann jemand mir helfen?  
  

  1. @@pices:

    nuqneH

      		<label>Reaktor mit 100 Kg Ethanol Befuellen  
    

    "kg" schreibt man klein. "befüllen" auch (und mit 'ü').

      		<label>Aufheizen bis 50°c176;C</label>  
    

    Da hattest du mal "&#176;C" zu stehen? Es sollte "°C" (großes C) sein oder "℃" (U+2103), auch mit Leerzeichen zwischen Zahl und Einheit.

      		<label>FiltrenKuchen 4\* waschen mit insgesamt 400 Kg wasser</label>  
    

    "4×".

    Habe versucht, funktioniert bei mir nicht.

    Soso.

    Vielleicht aber ich nicht richtig eingesetzt.

    Möglich. Wie sieht denn deine Transformation aus?

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)
    1. hallo,
      habe meine xslt Datei hundert Mal verändert. Bin im moment wieder hier "dir.xslt": ~~~xml

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
       xmlns:wpml="http://www.avt.rwth-aachen.de/ontologies/wpml.owl#"
       xmlns:bp="http://www.avt.rwth-aachen.de/batchPlus"
      xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon" >
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

      <!--<xsl:variable name="counter" saxon:assignable="yes">1</xsl:variable>-->

      <xsl:template match="bp:model">

      bp:model
      <xsl:call-template name="zaehlen"/>
      </bp:model>

      </xsl:template>  
      

      <xsl:template name="zaehlen">
      <xsl:param name="zahl" select="0"/>
      <xsl:for-each-group select="bp:Step" group-by="@bp:id">
      bp:Step
      <xsl:attribute name="bp:id" select="position()"/>
      <xsl:attribute name="rdf:id" select="@rdf:id"/>

      	<xsl:for-each select="unitProcedure" >  
      	<unitProcedure>  
      	<xsl:attribute name="bp:id"><xsl:number  level="any"/> </xsl:attribute>  
      	<xsl:attribute name="bp:up" select="@bp:up"/>  
      	<xsl:attribute name="rdf:id" select="@rdf:id"/>  
      		<xsl:copy-of select="label"/>  
      
      			<xsl:for-each select="operation">  
      		<xsl:call-template name="zaehlen">  
      			<xsl:with-param name="zahl" select="$zahl+ 1"/>  
      			</xsl:call-template>  
      			<operation>  
      			<xsl:attribute name="bp:id"><xsl:value-of select="$zahl"/> </xsl:attribute>  
      			<xsl:attribute name="bp:op" select="@bp:op"/>  
      			<xsl:attribute name="rdf:id" select="@rdf:id"/>  
      			<xsl:copy-of select="label"/></operation>  
      						</xsl:for-each>  
      
      		</unitProcedure>  
      		  
      		  
      			  
      	</xsl:for-each></bp:Step></xsl:for-each-group>  
      	  
        
      			</xsl:template>	  
      

      </xsl:stylesheet>

      1. hi,
        ist jemand noch dabei mir zu helfen?

  2. Hallo pices,

    Ich möchte diese Datei transformieren so, dass ich die gleiche bekomme aber mit immer eine unterschiedliche "bp:id" egal die stufe, wo man sich befindet.

    Das habe ich nicht verstanden, bzw. für mich sieht das Ausgangsdokument bereits wie gewünscht aus. Wie soll das Zieldokument also aussehen?

    Vermutlich reicht eine Identitäts-Transformation mit Neuschreiben der bp:id-Attribute.

    Grüße,
    Thomas

    1. hallo Thomas,
      das Problem ist, dass ich für die Weiterbearbeitung der Daten im Datenbank eindeutige "bp:id" im ganzen System haben soll. Die sollen nie gleich sein.In meine owl-datei momentan sind die wenn mann die node wechselt (bp:Step ,unitProcedure , operation) manchmal gleich. Das will ich ändern. Ich brauche eine neue nummerieung, die durch die ganze struktur geht und die "bp:id" egal die Ebene, immer neue Nummer verpasst.
      Ist das Problem jetzt bessert geklärt?

      1. Hallo pices,

        Ist das Problem jetzt bessert geklärt?

        Versuche es mit generate-id():

        <xsl:template match="@* | node()">  
          <xsl:copy>  
            <xsl:apply-templates select="@* | node()"/>  
          </xsl:copy>  
        </xsl:template>  
          
        <xsl:template match="@bp:id">  
         <xsl:attribute name="bp:id">  
           <xsl:value-of select="generate-id()"/>  
         </xsl:attribute>  
        </xsl:template>
        

        Grüße,
        Thomas

        1. Danke für deine Antwort.
          Das Problem ist nur das generated-id keine integer Zahl ausgibt . Habe ich schon das erstes Mal erklärt.
          welche Alternative gibt es noch?

          1. Hallo pices,

            Das Problem ist nur das generated-id keine integer Zahl ausgibt . Habe ich schon das erstes Mal erklärt.
            welche Alternative gibt es noch?

            AltovaXML erzeugt z. B. bp:id="idbp:id_1_3", wobei nur nach dem letzten "_" hochgezählt wird. Insofern wäre also substring-after(generate-id(),'idbp:id_1_') anwendbar.

            Alternativ hilft auch das Abzählen vorhergehender Elemente mit count() über die Achsen ancestor, parent usw., ggf. als Summe mehrerer count()-Aufrufe kombiniert.

            Grüße,
            Thomas

            1. Alternativ hilft auch das Abzählen vorhergehender Elemente mit count() über die Achsen ancestor, parent usw., ggf. als Summe mehrerer count()-Aufrufe kombiniert.

              Wie geht das?

              1. Hallo pices,

                Alternativ hilft auch das Abzählen vorhergehender Elemente mit count() über die Achsen ancestor, parent usw., ggf. als Summe mehrerer count()-Aufrufe kombiniert.

                Wie geht das?

                <xsl:template match="@* | node()">  
                  <xsl:copy>  
                    <xsl:apply-templates select="@* | node()"/>  
                  </xsl:copy>  
                </xsl:template>  
                  
                <xsl:template match="@bp:id">  
                 <xsl:attribute name="bp:id">  
                   <xsl:value-of select="count(ancestor::*[@bp:id]) + count(preceding::*[@bp:id])"/>  
                 </xsl:attribute>  
                </xsl:template>
                

                Grüße,
                Thomas

                1. Toll,
                  Danke danke

            2. Alternativ hilft auch das Abzählen vorhergehender Elemente mit count() über die Achsen ancestor, parent usw., ggf. als Summe mehrerer count()-Aufrufe kombiniert.

              hi Thomas,
              Wie geht das mit count()?.Es gibt auch die Möglichkeit einen Zähler im java zB. ~~~javascript

              public class Zaehler {
                  private int zaehler;

              public Zaehler() {
                      zaehler = 0;
                  }

              public int getZaehler() {
                      return zaehler;
                  }

              public void erhoeheZaehler(){
                      zaehler++;
                  }
              }

                
              <?xml version="1.0" encoding="UTF-8"?>  
              <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"  
              xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:wpml="http://www.avt.rwth-aachen.de/ontologies/wpml.owl#"  
               xmlns:bp="http://www.avt.rwth-aachen.de/batchPlus"  
               xmlns:zahl="U:/OWL/access/Zaehler.java"  
                xmlns:saxon="http://icl.com/saxon"  
                exclude-result-prefixes="zahl"  
              extension-element-prefixes="saxon">  
              	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
              	  
              	  
              	  
              	  
              	<xsl:template match="bp:model">  
              	<xsl:variable name="number">  
              <xsl:value-of select="zahl:getZaehler()"/>	  
              	</xsl:variable>  
              		<bp:model>  
              			<xsl:for-each-group select="bp:Step" group-by="@bp:id">  
              				<bp:Step>  
              					<xsl:attribute name="bp:id" select="$number"/>  
              					<xsl:attribute name="rdf:id" select="@rdf:id"/>  
              					<xsl:for-each select="unitProcedure">  
              						<unitProcedure>  
              							<xsl:attribute name="bp:id" select="$number"/>  
              							<xsl:attribute name="bp:up" select="@bp:up"/>  
              							<xsl:attribute name="rdf:id" select="@rdf:id"/>  
              							<xsl:copy-of select="label"/>  
              							<xsl:for-each select="operation">  
              								<operation>  
              									<xsl:attribute name="bp:id" select="$number"/>  
              									<xsl:attribute name="bp:op" select="@bp:op"/>  
              									<xsl:attribute name="rdf:id" select="@rdf:id"/>  
              									<xsl:copy-of select="label"/>  
              								</operation>  
              							</xsl:for-each>  
              						</unitProcedure>  
              					</xsl:for-each>  
              				</bp:Step>  
              			</xsl:for-each-group>  
              		</bp:model>  
              	</xsl:template>  
              </xsl:stylesheet>  
              
              ~~~.  
              Vergiss nicht wie geht das mit count().  
              Danke