2013-06-24 89 views
2

我只是將我的腳趾浸入到XML和XSL中,並且(從我讀過的內容中,毫不奇怪)我遇到了名稱空間方面的問題。XSL命名空間的誤解

我一直在考慮一些XML,我試圖寫一些XSL,但是我有一些訪問的命名空間的問題和屬性等等...

這裏是從XML提取物我一直給...

<?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> 
... 
... 
... 

我試圖訪問:的LandXML/CgPoint/CgPoints,這裏是我寫的XSL:

<?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> 

出於某種原因,我從來沒有進入 「CgPoint」模板(我從來沒有得到「在CgPoints」html輸出)。我已經嘗試過各種「LandXML/CgPoints/CgPoint」,「CgPoints/CgPoint」等組合在調用和模板定義中。

有沒有人有任何洞察我的誤解源於哪裏?

由於提前,

回答

0

你的元素被綁定到命名空間http://www.landxml.org/schema/LandXML-1.2

通常情況下,你會聲明命名空間與命名空間前綴的XSLT和使用,以解決他們在@select@match標準:

<?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> 

你也可以使用一個通用的匹配上的元素一個謂詞過濾器local-name()namespace-uri()<xsl:template match="*[local-name()='CgPoint' and namespace-uri()='http://www.landxml.org/schema/LandXML-1.2']">,但這是非常冗長和單調乏味的。

由於您使用XSLT 2.0,你也有其他兩個選項

1)使用通配符的命名空間:

<?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)使用xpath-default-namespace(麥克斯·託羅建議)

<?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

謝謝Mads,這有助於解決我的問題,並讓我更好地瞭解正在發生的事情。 – lmorse

0

使用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

嗨,感謝您的快速響應。嘗試了你的建議,但我的輸出保持不變:( – lmorse

+0

@ user2514675 - 嘗試將''更改爲''在XSLT ,上下文就是一切 –

+0

或者將apply-templates調整爲:'' –