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

推荐订阅源

云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
Last Week in AI
Last Week in AI
博客园_首页
I
InfoQ
T
Tailwind CSS Blog
爱范儿
爱范儿
雷峰网
雷峰网
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
WordPress大学
WordPress大学
A
About on SuperTechFans
V
Visual Studio Blog
有赞技术团队
有赞技术团队
P
Proofpoint News Feed

博客园 - 云起

ArcGISPro SDK Addin打包机制 一次 ArcGISPro Addin项本地化的排查实录 记一次arm机器装系统的经历 记一次vs中无法找到win sdk的问题 arcpy运行时,报错产品许可尚未初始化 Visual Studio 2022生成解决方案代码图报错“无法连接到指定的数据库” win10下定制文件夹 excel中,根据文件名查询文件路径 ArcGISPro SDK 3.1版本中使用QueuedTask的小问题 Compress-Archive压缩zip包的小瑕疵 Pro更新字段别名,重载数据后失效 在多个office文档内替换关键字 git日志分组 更新压缩流 使用excel生成简单的日历 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常 使用C#获取文件详情 Pro更改启动界面 使用AES加密时,结果不一样 命令行程序读取注册表失败的分析 pg_index
xlst处理时命名空间带来的小坑
云起 · 2025-05-13 · via 博客园 - 云起

在处理xml的过程中,之前使用的转换脚本,没有获得预期的结果。
xml的节点结构没有问题,经过对比和排查发现,异常的xml文件中,节点中指定了命名空间。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 模板匹配根节点 -->
    <xsl:template match="/">
        <buttons_with_id>
            <!-- 匹配所有有id属性的button节点 -->
            <xsl:for-each select="//button[@id]">
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </buttons_with_id>
    </xsl:template>
</xsl:stylesheet>
<!-- 正常的 -->
<interface>
    <group>
        <button id="btn1">Button 1</button>
    </group>
    <button>Unnamed Button</button>
    <button id="btn2">Button 2</button>
</interface>
<!-- 带命名空间 -->
<interface xmlns="test">
    <group>
        <button id="btn1">Button 1</button>
    </group>
    <button>Unnamed Button</button>
    <button id="btn2">Button 2</button>
</interface>

之前的xlst没有指定命名空间,会采用默认的空命名空间进行匹配,导致命名空间不一致,从而没有匹配到节点。
所以需要声明并指定命名空间,来进行匹配。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:test="test">
    <!-- 模板匹配根节点 -->
    <xsl:template match="/">
        <buttons_with_id>
            <!-- 匹配所有有id属性的button节点 -->
            <xsl:for-each select="//test:button[@id]">
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </buttons_with_id>
    </xsl:template>
</xsl:stylesheet>

如果需要匹配多个命名空间,可以使用或来适配。

xmlns:test1="test1"
xmlns:test2="test2"
<xsl:for-each select="//test1:button[@id] | //test2:button[@id]">