2017-02-14 31 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文档。到目前为止,我已经取得了一些成功,并且感谢他们在很短的时间内给出了精确的指针。 –