Thomas J.S.: Abfrage auf zwei xml Dokumenten beziehen

Beitrag lesen

Hallo,

so also so sieht die xsl jetzt aus:

Da sind schon mal eine Menge Fehler drinn, wenn ich dieses XSLT auf dein gepostetes XML beziehen. In den XMLs steht <person> im XSLT greifst du auf "/Person" zu.

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
        <xsl:element name="Person">
             <xsl:for-each select="/root/Person">

<xsl:for-each select="root/person">

(du bist bereits im "/" das ist also vor <root> nicht mehr nötig)

<xsl:call-template name="format"/>
             </xsl:for-each>
        </xsl:element>
    </xsl:template>

<xsl:template name="format">
            xsl:choose
                <xsl:when test="document('test.xml')//Person[@name = current()/ancestor::person/@name]"/>

<xsl:when test="document('test.xml')/root/person[@name = current()/@name]"></xsl:when>

Es ist kein guter Stil für when das "es soll nichts passieren" zu definieren. Dafür ist explizit otherwise gedacht, da der ja auch nur optional ist.

xsl:otherwise
                       <xsl:call-template name="erstellung"/>
                </xsl:otherwise>
            </xsl:choose>
    </xsl:template>
    <xsl:template name="erstellung">

xsl:copy
            <xsl:copy-of select="*"/>
        </xsl:copy>

Und was soll das bewirken? außer einer:
<person>
      <strasse>blablabla</strasse>
</person>

Wenn dann:
<xsl:template name="erstellung">
  <xsl:copy-of select="."/>
 </xsl:template>

---------------------------

  
<?xml version="1.0" encoding="utf-8" ?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
 <xsl:output method="xml" indent="yes"/>  
  
 <xsl:template match="/">  
  <xsl:element name="Person">  
   <xsl:for-each select="root/person">  
    <xsl:call-template name="format"/>  
   </xsl:for-each>  
  </xsl:element>  
 </xsl:template>  
  
 <xsl:template name="format">  
  <xsl:choose>  
   <xsl:when test="document('person2.xml')/root/person[@name = current()/@name]">  
    <nix />  
   </xsl:when>  
   <xsl:otherwise>  
    <xsl:call-template name="erstellung"/>  
   </xsl:otherwise>  
  </xsl:choose>  
 </xsl:template>  
  
 <xsl:template name="erstellung">  
  <xsl:copy-of select="."/>  
 </xsl:template>  
</xsl:stylesheet>  

Ergebnis ausgehend von deinen XMLs

<?xml version="1.0" encoding="UTF-8"?>
<Person>
   <nix/>
   <person name="hugo">
      <strasse>musterallee23</strasse>
   </person>
</Person>

Und eigentlich könnte man das ganze Gedönse noch etwas reduzieren:

  
<?xml version="1.0" encoding="utf-8" ?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
 <xsl:output method="xml" indent="yes"/>  
  
 <xsl:template match="/">  
  <xsl:element name="Person">  
   <xsl:for-each select="root/person[not(@name = document('person2.xml')/root//person/@name)]">  
    <xsl:copy-of select="."/>  
   </xsl:for-each>  
  </xsl:element>  
 </xsl:template>  
</xsl:stylesheet>  

Grüße
Thomas