匹配元素忽略命名空间

时间:2014-01-30 15:50:50

标签: xml xslt

我从服务中获取此xml:

<GetClass_RS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Class xmlns="http://www.company.com/erp/worker/soa/2013/03">
    <student>Jack</student>
    <student>Harry</student>
    <student>Rebecca</student>
    <teacher>Mr. Bean</teacher>
  </Class>
</GetClass_RS>

我希望像这样匹配班级/学生:

<xsl:template match="Class/student">
    <p>
        <xsl:value-of select="."/>
    </p>
</xsl:template>

问题是由于类的命名空间匹配不起作用:

<Class xmlns="http://www.company.com/erp/worker/soa/2013/03">

我想忽略匹配中的命名空间。

1 个答案:

答案 0 :(得分:3)

  

好的一点,我想我不需要忽视它。我只需要匹配   具有命名空间的元素

首先,请注意,如果命名空间是这样的:

<Class xmlns="http://www.company.com/erp/worker/soa/2013/03">

然后它也适用于它的所有子元素。换句话说,在您的XML输入中,studentteacher元素也位于该命名空间中。

如果输入XML中的元素具有命名空间,则还必须在XSLT样式表中提及该特定命名空间。以下一行:

xmlns:class="http://www.company.com/erp/worker/soa/2013/03"

声明此命名空间并定义前缀。前缀元素就像是声明其命名空间的简写方式。

<强>样式表

我添加了一个匹配teacher元素的模板。否则,它们的文本内容将通过XSLT处理器的默认行为输出。

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

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:class="http://www.company.com/erp/worker/soa/2013/03">

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

   <xsl:template match="/">
      <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="class:Class/class:student">
    <p>
        <xsl:value-of select="."/>
    </p>
   </xsl:template>

   <xsl:template match="class:teacher"/>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<p xmlns:class="http://www.company.com/erp/worker/soa/2013/03">Jack</p>
<p xmlns:class="http://www.company.com/erp/worker/soa/2013/03">Harry</p>
<p xmlns:class="http://www.company.com/erp/worker/soa/2013/03">Rebecca</p>

根据@ michael.hor257k的建议,如果将exclude-result-prefixes="class"添加到stylesheet元素,则输出的元素没有命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<p>Jack</p>
<p>Harry</p>
<p>Rebecca</p>