You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为带命名空间的XML应用XSLT遇节点选择问题求助

解决XSLT无法选中带默认命名空间的P2 XML元素问题

我明白你现在的困扰——明明加了命名空间声明,却还是选不到目标元素,这种情况在处理带默认命名空间的XML时特别容易踩坑。咱们直接说核心问题和解决方案:

问题根源:命名空间前缀混淆

你在XML里看到的<P2Main>及其子元素都属于默认命名空间urn:schemas-Professional-Plug-in:P2:ClipMetadata:v3.1,但你在XSLT里犯了两个关键错误:

  1. 把这个默认命名空间声明成了XSLT的默认命名空间(无前缀),但XPath在无前缀时只会匹配无命名空间的元素
  2. 错误地用xsi:前缀去引用这些元素——而xsi:对应的是http://www.w3.org/2001/XMLSchema-instance命名空间,和你的目标元素完全无关

修正后的XSLT代码

给目标命名空间绑定一个明确的前缀(比如p2),然后用这个前缀来编写所有XPath表达式和模板匹配:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:p2="urn:schemas-Professional-Plug-in:P2:ClipMetadata:v3.1">
    <xsl:output method="xml" indent="yes" />
    
    <xsl:template match="/p2:P2Main">
        <xsl:element name="clip">
            <video>
                <codec>
                    <xsl:value-of select="p2:ClipContent/p2:EssenceList/p2:Video/p2:Codec" />
                </codec>
                <byteoffset>
                    <xsl:value-of select="p2:ClipContent/p2:EssenceList/p2:Video/p2:VideoIndex/p2:StartByteOffset" />
                </byteoffset>
                <bytecount>
                    <xsl:value-of select="//p2:Video/p2:VideoIndex/p2:DataSize" />
                </bytecount>
                <starttimecode>
                    <xsl:value-of select="//p2:Video/p2:StartTimecode" />
                </starttimecode>
                <framerate>
                    <xsl:value-of select="//p2:Video/p2:FrameRate" />
                </framerate>
            </video>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

关键修改说明

  1. 命名空间绑定:新增xmlns:p2="urn:schemas-Professional-Plug-in:P2:ClipMetadata:v3.1",把目标命名空间和p2前缀关联起来
  2. 模板匹配修正:把/xsi:P2Main改成/p2:P2Main,正确匹配根元素
  3. XPath前缀替换:所有引用目标元素的地方都用p2:前缀,比如p2:ClipContent、p2:Video等
  4. 去掉了XSLT的默认命名空间声明(原来的xmlns="urn:..."),因为你输出的<clip>是自定义无命名空间元素,不需要继承这个命名空间

额外提示

  • 如果你需要输出的元素也属于P2命名空间,可以把xmlns="urn:..."加回到<xsl:stylesheet>或<clip>元素上,但根据你的需求,现在的设置更合适
  • XSLT 1.0对命名空间的处理要求严格,必须明确绑定前缀才能在XPath中引用带命名空间的元素

内容的提问来源于stack exchange,提问作者Tim Campbell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:56