我从服务中获取此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">
我想忽略匹配中的命名空间。
答案 0 :(得分:3)
好的一点,我想我不需要忽视它。我只需要匹配 具有命名空间的元素
首先,请注意,如果命名空间是这样的:
<Class xmlns="http://www.company.com/erp/worker/soa/2013/03">
然后它也适用于它的所有子元素。换句话说,在您的XML输入中,student
和teacher
元素也位于该命名空间中。
如果输入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>