2013-06-24 2 views
2
XSL Namespace

Je suis juste tremper mes orteils dans XML et XSL, et (de ce que j'ai lu, sans surprise) J'ai des problèmes avec le nom de l'espace.Malentendu

J'ai donné quelques XML, et je suis en train d'écrire une XSL, mais j'ai accès à certaines questions des espaces de noms et attributs, etc ...

Voici un extrait du XML que je suis donné ...

<?xml version="1.0" encoding="utf-8"?> 
<LandXML xmlns="http://www.landxml.org/schema/LandXML-1.2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
      http://www.landxml.org/schema/LandXML-1.2 
      http://www.landxml.org/schema/LandXML-1.2/LandXML-1.2.xsd" 
     version="1.2" 
     date="2013-06-24" 
     time="01:35:45" 
     readOnly="false" 
     language="English"> 
    <Units> 
    <Metric linearUnit="meter" areaUnit="squareMeter" 
      volumeUnit="cubicMeter" 
      angularUnit="decimal dd.mm.ss" 
      latLongAngularUnit="decimal degrees" 
      temperatureUnit="celsius" 
      pressureUnit="milliBars"/> 
    </Units> 
    <CoordinateSystem name="HATCH-121204" 
    horizontalDatum="Local" 
    verticalDatum="Local" 
    ellipsoidName="Australian National" 
    projectedCoordinateSystemName="UTM55" 
    fileLocation=""> 
    </CoordinateSystem> 
    <Application name="LandXML Export" 
    manufacturer="Leica Geosystems AG" 
    version="4.3" 
    manufacturerURL="www.leica-geosystems.com"> 
    <Author company="Leica Geosystems AG" 
     companyURL="www.leica-geosystems.com" 
     timeStamp="2013-06-24T01:35:45"/> 
    </Application> 
    <CgPoints> 
    <CgPoint name="GPS0093" 
      oID="GPS0093" 
      code="728" 
      desc="Tel 
      lines u/g" 
      role="measured" 
      latitude="-21.968945617359" longitude="148.007359609463" 
      ellipsoidHeight="288.420425" 
      timeStamp="2013-06-22T01:55:26" 
    >7570087.642555 603892.199974 234.579968</CgPoint> 
... 
... 
... 

Je suis en train d'accéder à: LandXML/CgPoint/Points Cg, voici que je l'ai XSL écrit:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- DWXMLSource="130622RLA.xml" --> 

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://xml.hexagon.com/schema/HeXML-1.5"> 
    <xsl:template match="/"> 
    <html> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
     <head> 
     <title>Field Report</title> 
     <link rel="stylesheet" type="text/css" href="books2_xslt.css"/> 
     <p class="header">Field Report</p> 
     </head> 
     <body> 
     <xsl:apply-templates select="CgPoints/CgPoint"/> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="CgPoint">   
    In CgPoints 
    <xsl:for-each select="@name"> 
     <xsl:value-of select="."/> 
     HELLO CgPoint 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

pour une raison quelconque, je ne jamais entrer dans la "CgPoint" template (je n'ai jamais la sortie html "In CgPoints"). J'ai essayé toutes sortes de combinaisons de "LandXML/CgPoints/CgPoint", "CgPoints/CgPoint" etc dans l'appel et la définition du modèle.

Quelqu'un at-il aperçu où mon malentendu provient de?

Merci à l'avance,

Lee

Répondre

0

Vos éléments sont liés à l'espace de noms http://www.landxml.org/schema/LandXML-1.2.

Habituellement, vous déclarer l'espace de noms dans votre XSLT avec un espace de noms préfixe et l'utiliser pour les traiter dans les @select et @match critères:

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="130622RLA.xml" --> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xml.hexagon.com/schema/HeXML-1.5" 
    xmlns:land="http://www.landxml.org/schema/LandXML-1.2"> 
    <xsl:template match="/"> 
     <html> 
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
      <head> 
       <title>Field Report</title> 
       <link rel="stylesheet" type="text/css" href="books2_xslt.css"/> 
       <p class="header"> 
        Field Report</p> 
      </head> 
      <body> 
       <xsl:apply-templates select="*/land:CgPoints/land:CgPoint"/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="land:CgPoint">  
     In CgPoints 
     <xsl:for-each select="@name"> 
      <xsl:value-of select="."/> 
      HELLO CgPoint 
     </xsl:for-each>  
    </xsl:template> 

</xsl:stylesheet> 

Vous pouvez également utiliser une correspondance générique sur les éléments avec un filtre de prédicat pour le local-name() et namespace-uri(): <xsl:template match="*[local-name()='CgPoint' and namespace-uri()='http://www.landxml.org/schema/LandXML-1.2']">, mais c'est extrêmement verbeux et fastidieux.

Puisque vous utilisez XSLT 2.0, vous avez également deux autres options

1.) Utilisez un caractère générique pour l'espace de noms:

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="130622RLA.xml" --> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xml.hexagon.com/schema/HeXML-1.5"> 
    <xsl:template match="/"> 
     <html> 
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
      <head> 
       <title>Field Report</title> 
       <link rel="stylesheet" type="text/css" href="books2_xslt.css"/> 
       <p class="header"> 
        Field Report</p> 
      </head> 
      <body> 
       <xsl:apply-templates select="*/*:CgPoints/*:CgPoint"/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="*:CgPoint">  
     In CgPoints 
     <xsl:for-each select="@name"> 
      <xsl:value-of select="."/> 
      HELLO CgPoint 
     </xsl:for-each>  
    </xsl:template> 

</xsl:stylesheet> 

2.) Utiliser xpath-default-namespace (comme Max Toro a suggéré)

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="130622RLA.xml" --> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xml.hexagon.com/schema/HeXML-1.5" 
    xpath-default-namespace="http://www.landxml.org/schema/LandXML-1.2"> 
    <xsl:template match="/"> 
     <html> 
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
      <head> 
       <title>Field Report</title> 
       <link rel="stylesheet" type="text/css" href="books2_xslt.css"/> 
       <p class="header"> 
        Field Report</p> 
      </head> 
      <body> 
       <xsl:apply-templates select="*/CgPoints/CgPoint"/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="CgPoint">  
     In CgPoints 
     <xsl:for-each select="@name"> 
      <xsl:value-of select="."/> 
      HELLO CgPoint 
     </xsl:for-each>  
    </xsl:template> 

</xsl:stylesheet> 
+0

Merci Mads, cela m'a aidé à résoudre mon problème et m'a donné une meilleure idée de ce qui se passe. – lmorse

0

utilisation xpath-default-namespace:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://www.landxml.org/schema/LandXML-1.2"> 
    ... 
</xsl:stylesheet> 
+0

Salut, Merci pour votre réponse rapide. J'ai essayé ce que vous avez suggéré, mais la sortie reste la même :( – lmorse

+0

@ user2514675 - Essayez de changer 'en '. Dans XSLT , le contexte est tout –

+0

ou d'ajuster les apply-templates à:. '. ' –