为带命名空间的XML应用XSLT遇节点选择问题求助
解决XSLT无法选中带默认命名空间的P2 XML元素问题
我明白你现在的困扰——明明加了命名空间声明,却还是选不到目标元素,这种情况在处理带默认命名空间的XML时特别容易踩坑。咱们直接说核心问题和解决方案:
问题根源:命名空间前缀混淆
你在XML里看到的<P2Main>及其子元素都属于默认命名空间urn:schemas-Professional-Plug-in:P2:ClipMetadata:v3.1,但你在XSLT里犯了两个关键错误:
- 把这个默认命名空间声明成了XSLT的默认命名空间(无前缀),但XPath在无前缀时只会匹配无命名空间的元素
- 错误地用
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>
关键修改说明
- 命名空间绑定:新增
xmlns:p2="urn:schemas-Professional-Plug-in:P2:ClipMetadata:v3.1",把目标命名空间和p2前缀关联起来 - 模板匹配修正:把
/xsi:P2Main改成/p2:P2Main,正确匹配根元素 - XPath前缀替换:所有引用目标元素的地方都用
p2:前缀,比如p2:ClipContent、p2:Video等 - 去掉了XSLT的默认命名空间声明(原来的
xmlns="urn:..."),因为你输出的<clip>是自定义无命名空间元素,不需要继承这个命名空间
额外提示
- 如果你需要输出的元素也属于P2命名空间,可以把
xmlns="urn:..."加回到<xsl:stylesheet>或<clip>元素上,但根据你的需求,现在的设置更合适 - XSLT 1.0对命名空间的处理要求严格,必须明确绑定前缀才能在XPath中引用带命名空间的元素
内容的提问来源于stack exchange,提问作者Tim Campbell
相关产品推荐
相关产品推荐

