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

推荐订阅源

博客园 - 【当耐特】
WordPress大学
WordPress大学
T
The Exploit Database - CXSecurity.com
博客园_首页
MyScale Blog
MyScale Blog
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
M
MIT News - Artificial intelligence
Microsoft Security Blog
Microsoft Security Blog
F
Full Disclosure
V
V2EX
博客园 - Franky
博客园 - 三生石上(FineUI控件)
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
SecWiki News
SecWiki News
N
Netflix TechBlog - Medium
S
Secure Thoughts
酷 壳 – CoolShell
酷 壳 – CoolShell
Hacker News: Ask HN
Hacker News: Ask HN
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Webroot Blog
Webroot Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Martin Fowler
Martin Fowler
PCI Perspectives
PCI Perspectives
S
Security @ Cisco Blogs
Recorded Future
Recorded Future
Help Net Security
Help Net Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
AI
AI
Microsoft Azure Blog
Microsoft Azure Blog
K
Kaspersky official blog
G
GRAHAM CLULEY
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
CERT Recently Published Vulnerability Notes
U
Unit 42
T
Tor Project blog
Cloudbric
Cloudbric
Hacker News - Newest:
Hacker News - Newest: "LLM"
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
Security Latest
Security Latest
N
News and Events Feed by Topic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

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

配置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