Hallo zusammen,
Ich hoffe, das Thema paßt hier rein: Ich versuche mich gerade an einer XSL-Transformation mittels SimpleXML, bei der zum einen aus einem XML alle namespaces entfernt werden. Dies funktioniert. Dabei sollen in dem XML zusätzliche Elemente umgewandelt werden. Diese entsprechen in etwa einer Ordered List/ Unordered List in HTML.
Mein Problem besteht in der XPath-Anweisung, die diese 2 Elemente matchen soll.
Die nicht funktionierenden Bedingungen sehen bei mir aktuell so aus:
Code:
<xsl:template match="*">
<xsl:choose>
<xsl:when test="local-name() = 'P-TA' and /COL[.='20p0'] and not(/P-NZ/P-NTFIRST)">
<xsl:comment>OL</xsl:comment>
</xsl:when>
<xsl:when test="local-name() = 'P-TA' and /P-NZ/P-NTFIRST[.='1.']" >
<xsl:comment>UL</xsl:comment>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Der zugehörige XML Abschnitt:
Code:
<!-- ol -->
<exp:P-TA xmlns:exp="http://www.example.com/export" cols="2">
<exp:COL>20p0</exp:COL>
<exp:COLLAST>0p0</exp:COLLAST>
<exp:P-NZ>
<exp:P-NTFIRST>1.</exp:P-NTFIRST>
<exp:P-NT>Aufzählung</exp:P-NT>
</exp:P-NZ>
<exp:P-NZ>
<exp:P-NTFIRST>2.</exp:P-NTFIRST>
<exp:P-NT>2. zeile</exp:P-NT>
</exp:P-NZ>
</exp:P-TA>
<!-- ul -->
<exp:P-TA xmlns:exp="http://www.example.com/export" cols="2">
<exp:COL>20p0</exp:COL>
<exp:COLLAST>0p0</exp:COLLAST>
<exp:P-NZ>
<exp:P-NT>ul</exp:P-NT>
</exp:P-NZ>
<exp:P-NZ>
<exp:P-NT>2.zeile</exp:P-NT>
</exp:P-NZ>
</exp:P-TA>
Meine bisherigen XPath-Versuche matchen leider nicht, hier steck ich aktuell in der Sackgasse:
Code:
<xsl:template match="*">
<xsl:if test="local-name() = 'P-TA'">
<!-- hier rein kommt er noch -->
<xsl:if test="/child::P-TA" />
<xsl:if test="/P-TA" />
<xsl:if test="/exp:P-TA" />
Was mache ich denn falsch?
Der Vollständigkeit halber die ganze XSL.
Code:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exp="http://www.example.com/xsd"
exclude-result-prefixes="xsl exp"
>
<xsl:output method="xml" indent="no"/>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="local-name() = 'P-TA' and /COL[.='20p0'] and not(/P-NZ/P-NTFIRST)">
<xsl:comment>UL</xsl:comment>
</xsl:when>
<xsl:when test="local-name() = 'P-TA' and /P-NZ/P-NTFIRST[.='1.']" >
<xsl:comment>OL</xsl:comment>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Wäre dankbar für jede XPath-Idee. Aus Performance-Gründen (in der Regel hat eine XML einige tausend Zeilen, von denen mehrere auf einmal verarbeitet werden sollen ) wollte ich das mit möglichst wenig php-XML-Operationen erledigen, sprich mich hierauf beschränken:
PHP-Code:
$xml = new SimpleXMLElement( $htmlPreExported );
$xslt = new XSLTProcessor();
$xslt->importStylesheet( $this->_xsl );
$result = $xslt->transformToXml( $xml );
Alternativ - falls das nicht in einem Aufwasch möglich wäre, wäre meine erste Idee, auf $result per sax-Parser loszugehen.
Danke für die Aufmerksamkeit und viele Grüße
Basti