2016-05-16 53 views
0

我正在嘗試調試與xpath相關的問題。我在我的XSLT中創建了一個變量$ MetaData,用於分配一個xml文檔,但由於某種原因,foreach循環無法找到它的子項,我無法進入foreach循環。XSLT無法找到每個的XPATH

XSLT:

<!-- language: lang-xslt --> 
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/TR/xhtml1/strict" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

    <xsl:variable name="_MetaData"> 
    <MetaData> 
     <EmployeeId>1233</EmployeeId> 
     <EmployeeName>abcd</EmployeeName> 
    </MetaData> 
    </xsl:variable> 
    <xsl:variable name="MetaData" select="msxsl:node-set($_MetaData)"></xsl:variable> 

    <xsl:template match="*|@*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[local-name()='MetaDataTag']"> 
    <xsl:copy> 

     <MetaData VocabularyOwner="acme.com" Vocabulary="MetaData"> 
     <xsl:for-each select="$MetaData//MetaData/*"> 
      <xsl:element name="Occurrence"> 
      <xsl:attribute name="Id"> 
       <xsl:value-of select="local-name(.)"/> 
      </xsl:attribute> 
      <xsl:attribute name="Value"> 
       <xsl:value-of select="string(.)"/> 
      </xsl:attribute> 
      </xsl:element> 
     </xsl:for-each> 
     </MetaData> 

    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML:

<?xml version="1.0" encoding="utf-8" ?> 
<Envelope> 
    <MetaDataTag /> 
</Envelope> 

如果我刪除的xmlns的xmlns = 「http://www.w3.org/TR/xhtml1/strict」 命名空間,一切似乎都工作正常,我能夠進入循環。 我不知道如何解決此問題,而不刪除xmlns =「http://www.w3.org/TR/xhtml1/strict」命名空間。

回答

1

如果您在XSLT中定義默認名稱空間,則變量中的節點將位於該名稱空間中。 Xpath沒有默認名稱空間,因此$MetaData//MetaData/*將不匹配{http://www.w3.org/TR/xhtml1/strict}MetaData元素節點。

一個解決方案是忽略使用local-name()的名稱空間。

`$MetaData//*[local-name() = 'MetaData']/*` 

,也可以定義爲XPath表達式(附加)前綴......

<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/TR/xhtml1/strict" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/TR/xhtml1/strict"> 

    ... 
</xsl:stylesheet> 

...並在表達式中使用它。

`$MetaData//xhtml:MetaData/*` 

但標籤是無效在XHTML命名空間,這樣它會是一個更好的主意創建空的命名空間中的數據元素:

<xsl:variable name="_MetaData"> 
    <MetaData xmlns=""> 
    <EmployeeId>1233</EmployeeId> 
    <EmployeeName>abcd</EmployeeName> 
    </MetaData> 
</xsl:variable> 
<xsl:variable name="MetaData" select="msxsl:node-set($_MetaData)"/> 

或者你定義一個特定的命名空間爲他們.. 。

<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/TR/xhtml1/strict" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:data="urn:data"> 

    <xsl:variable name="_MetaData"> 
    <data:MetaData> 
     <data:EmployeeId>1233</data:EmployeeId> 
     <data:EmployeeName>abcd</data:EmployeeName> 
    </data:MetaData> 
    </xsl:variable> 
    <xsl:variable name="MetaData" select="msxsl:node-set($_MetaData)"/> 
    ... 
</xsl:stylesheet> 

在表達式中使用:

$MetaData//data:MetaData/*