匹配 XSLT 上的属性而不是匹配整个元素

rov*_*nos 5 xml xslt xpath xslt-2.0

我想编写一个匹配属性而不是节点的 XSL 模板,

我认为有这样的东西:

<xsl:template match="@href | @conref | @conrefend">
    <xsl:message select="."/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

将匹配这 3 个属性名称中的任何一个,并打印以控制台属性的值,因为范围是属性本身而不是节点。

但我的测试证明我错了,我只能匹配包含任何这些属性的节点,如下所示:

 <xsl:template match="*[@href or @conref or @conrefend]">
   <xsl:message select="if(not(@href)) 
                        then    
                          if(not(@conref)) 
                          then @conrefend 
                          else @conref 
                        else @href"/>  
   </xsl:template>
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,如果碰巧存在一个具有多个属性的节点,那么只有一个被处理,而我需要处理所有这些属性。

关于为什么第一种方法不起作用的任何想法?

编辑1:完整的xslt:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      exclude-result-prefixes="xs"
      version="2.0">

     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>             
     <xsl:template match="@conref|@conrefend|@href">
        <xsl:message select="."/>
     </xsl:template>
   </xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

测试 XML:

  <links>
      <image conref="COPY-GUID/*+-862416}39-37CD-4CF7-A7AA-F09F4A763944" />
   </links>
Run Code Online (Sandbox Code Playgroud)

现在 XSLT 不匹配任何内容。

kjh*_*hes 3

您确实可以像第一个模板一样匹配模板中的属性。一定还有其他问题...

看看身份转换:

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

它可以很好地匹配您正在做的替代方案,并且替代方案之一适用于所有属性 ( @*)。

现在考虑一下这个xsl:apply-templates声明。注意如何@*明确调用。您确定您的模板有机会应用到属性吗?如果您像这样打电话xsl:apply-templates,例如:

        <xsl:apply-templates select="*"/>
Run Code Online (Sandbox Code Playgroud)

意识到只有元素会被选择,而不是属性。另请注意,node()也不包括属性。

更新

正确的。您的属性匹配模板永远没有机会应用。

添加上面的身份模板,或者类似这样的内容:

<xsl:template match="/">
    <xsl:apply-templates select="//@*"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

让您的属性匹配模板有机会应用。