XSLT ze źródłem XML, który ma domyślną przestrzeń nazw ustawioną na xmlns

Mam dokument XML z domyślną przestrzenią nazw wskazaną w katalogu głównym. Coś takiego:

<MyRoot xmlns="http://www.mysite.com">
   <MyChild1>
       <MyData>1234</MyData> 
   </MyChild1> 
</MyRoot>

XSLT do analizy XML nie działa zgodnie z oczekiwaniami z powodu domyślna przestrzeń nazw, tzn. po usunięciu przestrzeni nazw wszystko działa jak oczekiwane.

Oto mój XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:template match="/" >
  <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
     <NewRoot xmlns="http://wherever.com">
       <NewChild>
         <ChildID>ABCD</ChildID>
         <ChildData>
            <xsl:value-of select="/MyRoot/MyChild1/MyData"/>
         </ChildData>
       </NewChild>
     </NewRoot>
   </soap:Body>
  </soap:Envelope>
 </xsl:template>
</xsl:stylesheet>

Co należy zrobić z dokumentem XSLT, aby tłumaczenie działało poprawnie? Co dokładnie należy zrobić w dokumencie XSLT?

Author: Larry, 2009-08-28

3 answers

Musisz zadeklarować przestrzeń nazw w XSLT i użyć jej w wyrażeniach XPath. Np.:

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

Zauważ, że musisz podać jakiś prefiks, jeśli chcesz odwoływać się do elementów z tej przestrzeni nazw w XPath. Chociaż możesz po prostu zrobić xmlns="..." bez prefiksu i będzie to działać dla dosłownych elementów wyniku, nie będzie to działać dla XPath - w XPath, nieprzygotowana nazwa jest zawsze uważana za znajdującą się w przestrzeni nazw z pustym URI, niezależnie od xmlns="..." w zakresie.

 56
Author: Pavel Minaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-27 22:56:01

Jeśli używasz XSLT 2.0, określ xpath-default-namespace="http://www.example.com" w sekcji stylesheet.

 24
Author: vinh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 17:33:56

Jeśli był to rodzaj problemu ze spacją nazw, jest miejsce, aby spróbować zmodyfikować dwie rzeczy w pliku xslt:

  • Dodaj definicję" my " w znaczniku xsl: stylesheet
  • Użyj prefiksu "my:" podczas wywoływania elementów w pliku xml.

Wynik

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>
 3
Author: hama4g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 13:29:05