Thomas J.S.: mit xsl im xml nach elementen mit attributen suchen und ausgeben

Beitrag lesen

Hallo,

Hallo Thomas, bitte verzeih, wenn ich dich gleich direkt anfrage, aber ich bin erneut ratlos. ich habe mich vergeblich versucht, bzgl. xlink und linkbase einzulesen, werde aber einfach nicht schlau. vielleciht kannst du mir noch einmal helfen und einen tipp geben, wobei die lage nur etwas komplizierter wird.

meine xml:

Also von 'hosen' und 'taschen' haben wir uns ganz schön weit entfernt ;-)

Mein Problem, wie bekomme ich für das Element in meiner xml "ifrs-gp:AssetsTotal" aus der linkbase "ifrs-gp-lab-2005-05-15.xml" die entsprechende Bezeichnung <label xlink:type="resource" ...>Assets Total</label>., denn da ist die Bezeichnung als der Name hinterlegt und lautet Assets Total. Ich habe mich versucht in xlink und linkbase
einzulesen, aber ich finde einfach keine Weg, wie ich an der ???????????????? Stelle in meinem xsl  automatisch die Bezeichnung hinzufügen.

Also du möchstes aus deinem XSL auf eine Datei die in deinem XML verlinkt ist zugreifen und aus der Datei dann auf eine dort verlinkte andere Datei.

Das Erste Problem was du hast - wie du es selbst festgestellt hat (xmlns:xbrli) - ist die Frage des Defalut-Namespace in XSLT 1.0.

Hier eine Datei die dir das Gewünschte liefert (Erklärungen darunter):
-------------------------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
   xmlns:xbrli="http://www.xbrl.org/2003/instance"
   xmlns:xbrll="http://www.xbrl.org/2003/linkbase"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:link="http://www.xbrl.org/2003/linkbase"
   xmlns:ifrs-gp="http://xbrl.iasb.org/int/fr/ifrs/gp/2005-05-15">

<xsl:variable name="pathToSchema" select="document(/*[local-name() = 'xbrl']/link:schemaRef[2]/@xlink:href)" />
<xsl:variable name="pathToXML" select="document($pathToSchema/*[local-name() = 'schema']/*[local-name() = 'annotation']/*[local-name() = 'appinfo']/link:linkbaseRef[contains(@xlink:role, 'labelLinkbaseRef')]/@xlink:href)" />
<xsl:variable name="pathToLabels" select="$pathToXML/*[local-name() = 'linkbase']/*[local-name() = 'labelLink']/*[local-name() = 'label']" />
<xsl:output method="html"/>

<xsl:template match="/">
<html>
<head/>
<body>
<p>Bezeichnung:<xsl:value-of select="$pathToLabels[@xlink:label = 'ifrs-gp_AssetsTotal_lbl']" /></p>
<p>Wert:<xsl:value-of select="xbrli:xbrl/ifrs-gp:AssetsTotal"/>
</p>
<!-- <xsl:apply-templates select="xbrli:xbrl/ifrs-gp:AssetsTotal" /> -->
</body>
</html>
</xsl:template>
<!--
<xsl:template match="ifrs-gp:AssetsTotal">
<xsl:variable name="name" select="name()" />
<p>Bezeichnung:<xsl:value-of select="$pathToLabels[@xlink:label = concat(translate($name, ':', '_'), '_lbl')]" />
</p>
<p>Wert:
  <xsl:value-of select="."/>
</p>
</xsl:template>
 -->
</xsl:stylesheet>
-------------------------------------------------

Variable "pathToSchema":
Ich habe überall mit local-name() gearbeitet, da der Default-Namespace nur auf dein XML-Datei wirkt, aber dann nicht mehr auf die anderen verlinkten Dateien.
"link:schemaRef[2]" ließ sich nicht vermeiden, da es sonst keine Unterschiedungsmöglichkeit zwischen den "link:schemaRef"-Elementen gab.

Variable "pathToXML" spricht soweit für sich.

Variable "pathToLabels": spricht auch für sich, aber wenn du z.B. deutsche Bezeichnungen vorselektieren willst kannst du am "/*[local-name() = 'label']" ein "[@xml:lang = 'de']" anhängen: /*[local-name() = 'label'][@xml:lang = 'de']
oder so machen: /*[(local-name() = 'label') and (@xml:lang = 'de')]

Bisher habe ich die Bezeichnung in meinem xsl immer manuell eintippen muessen.

Wärest du fast noch immer besser dran ;-)

Ich wuerde es aber gerne automatisieren, da es jetzt auch eine linkbase mit der deutschen Bezeichnung gibt, ich muesste demnach nur die label linkbase austauschen und nicht die Menge an einzelnen Posten neu schreiben bzw. wäre so ein xsl dann "mehrsprachfähig" da ich jeweils nur die entsprechende linkbase benötige.

Dafür steht der auskommentierter Teil im Beispiel XSL, damit du das doch nicht von Hand schreiben musst.

Wie gesagt eine harte Nuss für mich, vielleicht kannst du mir einen Tipp geben, wie ich es anstellen kann, das als Ergbnis da kommt:

Ic habe das jetzt mit Saxon und dem MSXML (und mit den Online-Dateien) getestet und das Ergebnis war:
<body>
      <p>Bezeichnung:Assets, Total</p>
      <p>Wert:100359405529</p>
</body>

Ich hoffe es hilft dir weiter.

Grüße
Thomas

PS: vergiss nicht im <xsl:stylesheet ein exclude-result-prefixes -Attribut und darin alle Namensraumpräfixe anzugeben (exclude-result-prefixes="xlink link ifrs-gp ..."), sonst hast du sie am Ende alle in deinem HTML.