php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.08.2011, 22:28  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard [Erledigt] xsl Transformation xpath für namespaced elements

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&#xE4;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
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.08.2011, 10:24  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hi,

Mit / selektierst du das Wurzelelement, nicht das Kindelement! /COL ist also falsch.

Ohne Namespace (also statt exp:COL nur COL) funktioniert zumindest dieser Ausdruck: child::COL[text()='20p0']
Allerdings steh ich auf Kriegsfuß mit Namespaces, aber vielleicht reicht dir das schon als Ansatz.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 25.08.2011, 19:22  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Ach ich Vollhorst...

Klappt jetzt auch mit Namespace:
Code:
<xsl:template match="*"> 
    <xsl:choose> 
        <xsl:when test="local-name() = 'P-TA' and exp:COL[.='20p0'] and not(exp:P-NZ/exp:P-NTFIRST)"> 
            <xsl:for-each select="exp:P-NZ"> 
                <P-BL><xsl:value-of select="exp:P-NT" /></P-BL> 
            </xsl:for-each> 
        </xsl:when> 
        <xsl:when test="local-name() = 'P-TA' and exp:P-NZ/exp:P-NTFIRST[.='1.']" > 
            <xsl:for-each select="exp:P-NZ"> 
                <P-NL> 
                    <P-NU><xsl:value-of select="exp:P-NTFIRST" /></P-NU> 
                    <P-NB><xsl:value-of select="exp:P-NT" /></P-NB> 
                </P-NL> 
            </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
            <xsl:element name="{local-name()}"> 
                <xsl:apply-templates select="@*|node()"/> 
            </xsl:element> 
        </xsl:otherwise> 
    </xsl:choose> 
</xsl:template>
Vielen Dank!

Grüße


Basti
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Problem mit XPath - XPath liefert nicht das erwartete Ergebnis Suralc PHP Einsteiger 8 26.04.2011 22:11
[Erledigt] HTML-Reports auswerten mit xpath obelix PHP Einsteiger 11 26.04.2011 15:45
[Erledigt] Mit xpath() mehrere Knoten suchen &amp; ausgeben wooha PHP Einsteiger 5 21.04.2011 00:24
[Erledigt] Korrekter XPath? Dark Guardian PHP Einsteiger 10 15.02.2011 14:27
[Erledigt] Mit PHP auch XPATH? muncher PHP Einsteiger 15 08.01.2011 12:37
DOM: Inhalt eines Elements auslesen konze PHP Tipps 2010 2 08.08.2010 17:11
[Erledigt] Mit xpath den nodevalue vergleichen dileso PHP Tipps 2010 2 06.05.2010 10:54
String Transformation Chriz Software-Design 22 02.02.2009 16:11
XML Kommentar mit XPath auslesen den JavaScript, Ajax und mehr 1 08.12.2008 15:48
Error bei Benützung von xpath Arno PHP-Fortgeschrittene 2 25.04.2008 10:28
Node Selection mit XPath HStev PHP Tipps 2005-2 3 12.08.2005 12:21
[Erledigt] XML mit simplexml und xpath in HTML umwandeln PHP-Fortgeschrittene 3 15.07.2005 01:39

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
when test xpath xsl xsl:when, funktioniert copy xslt mit php, php xsl if bedingungen, xsl:element name xpath, xsl:when test child name, xslt xsl:if php, xsl ta, xsl:template local-name, xslt local-name child::, xsl <xsl:when> test xpath, xsl export all nodes that match xpath, p elemente transformation, xpath element name, xsl:when test=\local-name()\, xpath local-name()

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:05 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum