默认情况下,XPath 表达式中不带前缀的元素名称是指没有命名空间的元素,因此表达式EventDocument
选择具有本地名称“EventDocument”且没有命名空间的元素。这
<EventDocument ... xmlns="http://www.itron.com/ItronInternalXsd/1.0/">
元素与此模式不匹配,因为它在http://www.itron.com/ItronInternalXsd/1.0/
命名空间中。
你有两个选择,要么
- 将该命名空间绑定到stylesheet 中的前缀,然后使用 XPath 表达式中的前缀,或者
- (因为你说你在 XSLT 2.0 中)使用
xpath-default-namespace
示例 1
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:itron="http://www.itron.com/ItronInternalXsd/1.0/"
version="2.0">
<xsl:template match="itron:example">
<xsl:if test="itron:EventDocument">....</xsl:if>
</xsl:template>
</xsl:stylesheet>
示例 2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.itron.com/ItronInternalXsd/1.0/"
version="2.0">
<xsl:template match="example">
<xsl:if test="EventDocument">....</xsl:if>
</xsl:template>
</xsl:stylesheet>
我个人的偏好是选项 1,基于“最小意外原则”,任何人都必须在未来维护样式表(包括原作者,在休息几个月后回到代码......)。