2017-02-14 54 views
0

我有一個xml文件,如下所示。爲了簡潔起見,我沒有列出它完整。處理XSLT中的名稱空間和變量

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<OBJECTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns="http://www.example.com/" 
     xsi:schemaLocation=".\\intermediate\\example.xsd"> 
    <OBJECT> 
     <abbreviation>ABCD</abbreviation> 
     <LINKS> 
     .... 

我想在我的XSLT中引用它的一些部分。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:t="http://www.example.com/" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=".\\intermediate\\example.xsd"> 

<xsl:output method="xml" indent="yes" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="objs" select ="t:OBJECTS/OBJECT"/> 
<xsl:variable name="cnt" select="count($objs)"/> 

<xsl:template match="t:*"> 
Count of objects is <xsl:value-of select="$cnt" /> 
</xsl:template> 

</xsl:stylesheet> 

我的意圖是根據該名稱空間顯示所有對象的計數。我無法做到這一點。

Count of objects is 100. 

如果我刪除XML文件中的命名空間,我就會得到它。問題在哪裏?

回答

1

不是100%確定你想要什麼來實現,但我你不使用你的孩子選擇了t:前綴,所以我建議使用

<xsl:variable name="objs" select ="t:OBJECTS/t:OBJECT"/> 

,而不是

注意到
<xsl:variable name="objs" select ="t:OBJECTS/OBJECT"/> 
+1

這是正確的。一個默認的名字空間(沒有前綴)被繼承,所以'OBJECT'和它的父'OBJECTS'在同一個名字空間中。 –

+0

它工作完美。我的目標是使用單個xslt處理來自多個命名空間的多個xml文檔。到目前爲止,我已經取得了一些成功,並且感謝他們在很短的時間內給出了精確的指針。 –