使用:
/*/Abstract
[substring-after(@xsi:type, ':') = 'XYZImpl']
[namespace::*
[name() = substring-before(../@xsi:type, ':')
and
. = 'http://www.namspace.org/impl'
]
]
这将选择Abstract
XML 文档顶部元素的任何子元素,该元素的名称空间带有前缀,该前缀也是其xsi:type
属性中包含的 QName 值的前缀。而属性中包含的 QName 值的“local-name”部分xsi:type
正是 string "XYZImpl"
。
基于 XSLT 的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="some:xsi">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/Abstract
[substring-after(@xsi:type, ':') = 'XYZImpl']
[namespace::*
[name() = substring-before(../@xsi:type, ':')
and
. = 'http://www.namspace.org/impl'
]
]
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时(由提供者生成,通过使其格式正确):
<t xmlns:xsi="some:xsi">
<Abstract xmlns:q3="http://www.namspace.org/impl"
xsi:type="q3:XYZImpl">
</Abstract>
<Abstract xmlns:q8="http://www.namspace.org/another"
xsi:type="q8:XYZImpl">
</Abstract>
</t>
选择所需的正确元素并将其复制到输出:
<Abstract xmlns:q3="http://www.namspace.org/impl" xmlns:xsi="some:xsi" xsi:type="q3:XYZImpl"/>
请注意:为了成功评估 XPath 表达式,xsi
必须在您的 XPath 实现中注册带有前缀的适当名称空间。