wur*_*ack 11 php xml xslt xpath
我需要根据给定命名空间中的属性创建XPath表达式进行过滤.示例XML是:
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/'
xmlns:yt='http://gdata.youtube.com/schemas/2007'> ...
<entry>
<media:group>
<media:thumbnail url='http://i.ytimg.com/1.jpg' yt:name='default'/>
<media:thumbnail url='http://i.ytimg.com/2.jpg' yt:name='hqdefault'/>
<media:thumbnail url='http://i.ytimg.com/3.jpg' yt:name='start'/>
<media:thumbnail url='http://i.ytimg.com/4.jpg' yt:name='middle'/>
</media:group>
</entry>
Run Code Online (Sandbox Code Playgroud)
我需要获取节点的url,其属性yt:name设置为'hqdefault'.
我尝试使用XPath表达式
'./media:group/media:thumbnail[@yt:name='hqdefault']/@url'
Run Code Online (Sandbox Code Playgroud)
但似乎用yt:name指定namespaced属性不起作用.我在进行查询时得到一个空的DOMNodeList.
我在php中访问XML,所以我注册了yt命名空间:
registerNamespace( 'yt', 'http://gdata.youtube.com/schemas/2007' );
Run Code Online (Sandbox Code Playgroud)
Thnx提前
XPath看起来是正确的.
可能是您的库不支持命名空间属性,或者您没有正确注册yt命名空间和/或media命名空间.
尝试只匹配谓词过滤器的内部local-name()和namespace-uri()内部,而不是使用namespace-prefix:
./*[local-name()='group'
and namespace-uri()='http://search.yahoo.com/mrss/'
]/*[local-name()='thumbnail'
and namespace-uri()='http://search.yahoo.com/mrss/'
and @*[local-name()='name'
and namespace-uri()='http://gdata.youtube.com/schemas/2007'
and .='hqdefault'
]
]/@url
Run Code Online (Sandbox Code Playgroud)
如果这样做,那么在注册这些名称空间前缀的名称空间时会出现问题.
名称yt空间前缀在示例 XML 中使用,但未声明。如果该示例 XML 确实就是全部内容,那么它就不是格式良好的 XML(就命名空间而言)。因此,没有通用的 XML 工具(例如 XSLT)可能能够处理它。
另一方面,如果yt您的源文档中某处有命名空间前缀的声明,但您尚未向我们展示,那么您需要在 XPath 处理环境(我猜是 XSLT)中声明相同命名空间 URI 的前缀。例如
<xsl:stylesheet ... xmlns:yt="theNamespaceURIForYT">
Run Code Online (Sandbox Code Playgroud)
XPath 不知道源文档中出现的任何名称空间前缀声明。它只知道每个元素(和属性)属于哪个名称空间(URI)。
| 归档时间: |
|
| 查看次数: |
15457 次 |
| 最近记录: |