Xslt 选择不在给定命名空间中的属性的XSL/XPath语法

Xslt 选择不在给定命名空间中的属性的XSL/XPath语法,xslt,xpath,Xslt,Xpath,假设我处于xml元素的上下文中: <xsl:copy-of select="@*"/> 将给我一份所有属性的副本。我正在寻找一个xpath表达式,它将为我提供除给定名称空间中的属性以外的所有属性,比如“x” 我的当前代码: <xsl:copy-of select="@*[not(starts-with(name(),'x:'))]"/> 有效,但不是最佳答案 注意:很高兴了解XSLT2.0,但是在XSLT2.0中寻找1.0答案,您可以编写。使用XSLT

假设我处于xml元素的上下文中:

  <xsl:copy-of select="@*"/>

将给我一份所有属性的副本。我正在寻找一个xpath表达式,它将为我提供除给定名称空间中的属性以外的所有属性,比如“x” 我的当前代码:

  <xsl:copy-of select="@*[not(starts-with(name(),'x:'))]"/>

有效,但不是最佳答案


注意:很高兴了解XSLT2.0,但是在XSLT2.0中寻找1.0答案,您可以编写
。使用XSLT1.0,您所能做的就是使用
(当然是替换
http://example.com/
输入属性的名称空间)。

不要使用
xsl:copy of
,而是使用
xsl:apply templates select=“@*”
,并有两个模板规则

<xsl:template match="@*"><xsl:copy/></xsl:template>

<xsl:template match="@x:*"/>


感谢您的回答,我不愿意直接使用uri,因为我讨厌在xsl代码中使用uri两次。与上面提到的我的名字()黑客相比,这有什么效率优势吗?不,效率没有什么不同,但对于极少数情况,例如
命名空间uri检查会同时查找两个属性,而
开头的检查只查找一个属性。我知道这个解决方案,但考虑到需要的次数,这有点像维护噩梦