惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
K
Kaspersky official blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog
aimingoo的专栏
aimingoo的专栏
M
MIT News - Artificial intelligence
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
Stack Overflow Blog
Stack Overflow Blog
量子位
S
Secure Thoughts
G
GRAHAM CLULEY
C
CXSECURITY Database RSS Feed - CXSecurity.com
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
T
Threat Research - Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 聂微东
宝玉的分享
宝玉的分享
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
Forbes - Security
Forbes - Security
Engineering at Meta
Engineering at Meta
S
Security Affairs
Help Net Security
Help Net Security
博客园 - 三生石上(FineUI控件)
AWS News Blog
AWS News Blog
博客园 - 叶小钗
Recent Commits to openclaw:main
Recent Commits to openclaw:main
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
Project Zero
Project Zero
H
Heimdal Security Blog
W
WeLiveSecurity
C
Check Point Blog

一个博客站点,记录各种事情

配置NAS,安装OMV tiddlywiki服务器版本安装与配置 尝试使用cgroups限制程序资源占用 apparmor强制访问控制系统配置 为emacs配置特殊快捷键,方便移动端使用 gpg使用介绍与配置说明 aur用户软件仓库和PKGBUILD脚本的一些记录 搭建、配置gitea代码自托管平台 关于ssh密钥登陆遇到的一些问题,以及其解决方法 hugo配置commento评论服务。 生日快乐!对近期的回顾以及对未来的畅想 记一次tt-rss搭建 阿莱桑公寓的一些补充信息? 阿莱桑公寓-顺序整理 再见,2019,你好,2020——元旦快乐 irc服务端安装,unrealircd安装和配置,和配置说明 hello world,第一篇博客,原因和目标。
在xslt中,xpath配置命名空间
crimsonote · 2021-11-23 · via 一个博客站点,记录各种事情

文章目录

问题简要

最近在尝试折腾opds相关的东西,将opds转为特定格式的html并由rclone挂载,但是遇到了一个命名空间相关的问题,opds使用的xml格式设置了一个命名空间,导致无法正常使用xpath解析opds原始文件,在此就尝试解决的内容进行记录。

命名空间简述

xml的命名空间是用于避免多个xml发生冲突的方法。

其在xml中使用 xmlns 以类似于属性的方式进行规定。可以在xmlns关键字后面加上冒号以规定名称空间简写,如果没有简写,则在该xml子树中视为默认命名空间(没特别声明的标签将会归类至该标签中)

该xmlns允许主动声明为空值,表示归类在空 命名空间。也就是未主动声明命名空间的情况下所属的命名空间。

1
2
3
4
5
6
7
<xml xmlns="http://www.w3.org/TR/html4/" xmlms:dc="http://purl.org/dc/terms/">
  <test>test</test>
  <dc:test>test</test>
  <body xmlns=''>
    <p>test</test>
  </body>
</xml>

比如说上面这个xml中,和标签属于’http://www.w3.org/TR/html4/'命名空间下,而dc:test标签属于’http://purl.org/dc/terms/'命名空间下。而以及里面的子树则被归类在了空命名空间。

类似于这样,允许一个xml中使用多个命名空间。能够方便配置,以及避免冲突……?

假设一个xml如下,并使用了一个默认命名空间

1
2
3
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/terms/" xmlns:opds="http://opds-spec.org/2010/catalog">
  <test>xxx</test>
  </feed>

这样一个xml不能使用 /feed/test 来匹配,因为feed位于一个另外的命名空间,这时可以用 /*['feed'=local-name()] 来忽略命名空间强行匹配,不过,需要注意的是,此处命名空间设置,不会递归传递到后面,因此,如果需要多层嵌套的话,会非常麻烦。 /*['feed'=local-name()]/*['test'=local-name()] 而且,也有可能(极小概率的)导致出现命名空间冲突(毕竟命名空间本来就是用来规避冲突的嘛)。

而在xpath2.0版本中,以上语法也能记作 “\*:foo"来忽略命名空间匹配本地名称,不过,该新版标准并不太普及(至少截至本文,xnllint并不支持该语法),如果不支持则还需要记作 [local-name() = 'foo']

在xslt中设置命名空间前戳

如果只是需要在xslt中使用xpath匹配其他xml的命名空间的话,则可以考虑将对应的命名空间对应一个前戳来使用。

只需要在xsl:stylesheet标签中将对应的xmlns:前戳的属性加上去即可。

1
2
3
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/terms/" xmlns:opds="http://opds-spec.org/2010/catalog">

</xsl:stylesheet>

类似于这样,在该xsl文件中,可以直接使用 ’\/atom:标签/‘ 这样的xpath来匹配属于’http://www.w3.org/2005/Atom'命名空间的标签。能够大幅度简化xpath的配置,并提高xpath的准确性。(毕竟 ['标签'=local-name()] 这样的xpath,是直接忽略掉命名空间进行匹配的呢)

链接记录,参考文章

https://www.w3school.com.cn/xml/xml%5Fnamespaces.asp
https://www.cnblogs.com/bmaker/p/5605738.html
https://hustlei.github.io/2015/05/xml-xsl-xpath-namespace.html

文章作者 crimsonote

上次更新 2021-11-23