首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPATH检查属性是否包含多个值中的一个

XPATH检查属性是否包含多个值中的一个
EN

Stack Overflow用户
提问于 2016-06-03 05:18:48
回答 4查看 1.7K关注 0票数 3

我需要检查XML节点的属性是否包含其中一个值,下面是我的XML:

代码语言:javascript
复制
<manifest>
    <item id="item_557c683790288" href="navigation.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="toc" href="navigation.xhtml" media-type="application/xhtml+xml" properties="nav"/>
    <item id="item_557c68379035d" href="title-page.html" media-type="application/xhtml+xml" properties="scripted"/>
    <item id="item_557c683790414" href="imprint.html" media-type="application/xhtml+xml" properties="scripted svg"/>
    <item id="item_557c6837904b6" href="author.html" media-type="application/xhtml+xml" properties="scripted"/>
    <item id="item_557c683790572" href="file_557c6766c75a9.html" media-type="application/xhtml+xml" properties="scripted"/>
    <item id="item_557c683790625" href="liberio.css" media-type="text/css"/>
    <item id="item_557c6837906ef" href="assets/2dcc626f-387f-4658-d6f6-58570ae176e7.jpg" media-type="image/jpeg"/>
    <item id="item_557c6837907c4" href="assets/liberio_color.svg" media-type="image/svg+xml"/>
    <item id="item_557c683790879" href="assets/93d7f25284aeda831bde692e6b002b9f.png" media-type="image/png"/>
    <item id="item_557c683790949" href="assets/properties.js" media-type="application/javascript"/>
</manifest>

现在我使用下面的表达式:

代码语言:javascript
复制
$images = $this->opfSxml->xpath("//*[local-name()='manifest']/*[local-name()='item'][contains(@media-type,'png') or contains(@media-type, 'jpg') or contains(@media-type, 'ico') ]");

我的代码工作正常,但对我要检查的每个值重复OR和CONTAINS对我来说并不合适。

有没有写这篇文章的捷径?

EN

回答 4

Stack Overflow用户

发布于 2016-06-03 11:01:17

使用的

代码语言:javascript
复制
//manifest/*[contains('png|jpeg|ico',substring-after(@media-type,'/'))]

这假设媒体类型是无前缀的字符串 --也就是说,没有这样的字符串是另一个字符串的前缀。

如果没有前缀的假设不成立,请使用

代码语言:javascript
复制
//manifest/*[contains('|png|jpeg|ico|',concat('|',substring-after(@media-type,'/'),'|'))]
票数 2
EN

Stack Overflow用户

发布于 2016-06-03 06:17:13

在纯XPath中--不。我能想到的最短的XPath是:

代码语言:javascript
复制
//manifest/item[contains(@media-type,'png') or contains(@media-type, 'jpg') or contains(@media-type, 'ico') ]
票数 1
EN

Stack Overflow用户

发布于 2016-06-03 06:50:59

我不认为它更短,

代码语言:javascript
复制
$dom = new DOMDocument;
$dom->loadXML($str);
$xp = new DOMXPath($dom);

// Create function returning boolean
function is_image($str) { 
    str_replace(['png','jpeg','ico'], '', $str, $c);
    // If substring found, it returns true
    return $c !== 0 ;
}

$xp->registerPHPFunctions();
$xp->registerNamespace("php", "http://php.net/xpath");

// And now our short Xpath :) 
$images = $xp->query("//item[php:function('is_image', string(@media-type))]");

foreach($images  as $img) 
   print_r($img); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37602288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档