Stefan Eickhoff: Attribut nur übernehmen wenn kein gleichbenamstes vorhanden ist

Beitrag lesen

Hallo,

aktuell knobele ich an einem XSLT/XPATH-Problem und komme nicht auf die Lösung.

Gegeben ist ein XML-Dokument in welchem die Elemente gleichbenamste Attribute aus unterschiedlichen Namespaces haben können.

Jetzt möchte ich das so transformieren, dass eine Version des Attributes
Priorität hat.
Im folgenden Beispiel die Variante ohne den Namespace "tmp:".

Anbei mal mein bisheriger Stand.

Es soll nach der Transformation immer id="A" resultieren.

Mein erster Versuch (test1.xsl) ist von der Reihenfolge der Attribute abhängig und versagt daher beim "text"-Element.

Mein zweiter Versuch tut es, aber hier ist im "not(../@id)" der Attributname fest verdrahtet.

Aktuell hänge ich beim dritten Versuch fest, eine test-Bedingung zu konstruieren die prüft ob es zu einem beliebigen @tmp:* ein gleichnamiges Attribut ohne Namespace gibt.

test.xml
--------
<?xml version="1.0" encoding="UTF-8"?>

<root xmlns:tmp="http://example.org/tmp">

<title tmp:id="A">Test</title>
 <page tmp:id="B" id="A">

<text id="A" tmp:id="B"></text>

</page>

</root>

test1.xsl
--------
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tmp="http://example.org/tmp"

<xsl:template match="@*|node()">
    xsl:copy
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

<xsl:template match="@tmp:*">
   <xsl:attribute name="{substring-after
                     ( name(.), ':' )}" select=""><xsl:value-of select="." /></xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

test2.xsl
---------
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tmp="http://example.org/tmp"

<xsl:template match="@*|node()">
    xsl:copy
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

<xsl:template match="@tmp:*">
   <xsl:if test="not(../@id)">
    <xsl:attribute name="{substring-after
                     ( name(.), ':' )}" select=""><xsl:value-of select="." /></xsl:attribute>
   </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Ggf. ist mein Ansatz schon verkehrt und es gibt eine "richtigere" Lösung.
Danke für alle Tipps und Schläge mit dem Zaunpfahl.

Viele Grüße

Stefan

--
bythewaythewebsuxgoofflineandenjoytheday