在XSLT中处理名称空间和变量

时间:2017-02-14 12:38:31

标签: xml variables xslt namespaces

我有一个如下所示的xml文件。为简洁起见,我并未将其列为完整。

<?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 个答案:

答案 0 :(得分:2)

不是100%确定您想要实现的目标但我已经注意到您未在您的子选择器中使用t:前缀,因此我建议您使用

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

而不是

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