相同的xpath适用于命令行,但不适用于xslt

时间:2015-01-27 17:31:55

标签: xslt xpath xml-namespaces

我是xslt和xpath的初级用户。在命令行(Ubuntu 14.04)上使用带有xml文件的xpath可以正常工作,但xslt文件中的xpath不会返回任何内容。我正在使用Juniper Junos xml文件。有什么建议? 谢谢, 乔治

xml文件以:

开头
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/12.3R8/junos">
  <interface-information xmlns="http://xml.juniper.net/junos/12.3R8/junos-interface" junos:style="normal">
    <physical-interface>
      <name>fe-0/1/0</name>
      <logical-interface>
        <name>fe-0/1/0.0</name>
          ...

在Ubuntu 14.04中运行的命令行是: xpath -e "/rpc-reply/interface-information/physical-interface/logical-interface/name" interfaces.xml

xslt文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <h2>Interfaces</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Name</th>
      </tr>
      <xsl:for-each select="/rpc-reply/interface-information/physical-interface/logical-interface">
        <tr>
          <td><xsl:value-of select="name"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:3)

这里的问题非常简单。您没有在XPath中使用名称空间。显然你的命令行实用程序并不关心,或者根据元素'QNames 评估XPath忽略默认命名空间,并对名称空间进行其他一些非标准处理。

解决方案:

在样式表的顶部声明前缀:

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:nbase="urn:ietf:params:xml:ns:netconf:base:1.0"
  xmlns:junosi="http://xml.juniper.net/junos/12.3R8/junos-interface"
>

在XPath中使用这些前缀:

<xsl:for-each select="/nbase:rpc-reply/junosi:interface-information
                        /junosi:physical-interface/junosi:logical-interface">
  <tr>
    <td><xsl:value-of select="junosi:name"/></td>
  </tr>
</xsl:for-each>