2010-07-20 87 views
0

的选择元素名称我有可能是一个相当具体的问题..XSL和XPath的 - 属性

我将在一些条件的窗体上输入一个用户,然后它建立从输入的XPath。比方说,他们的意见将创建下列:

//*[@color='red']/@* 

这基本上意味着他们希望看到任何元素的所有属性与@color =红色。

我可以精确显示表达式要求的(所有属性),但我想添加可能有用的信息,例如属性所属的元素名称。

一个选项是添加到XPath中,以显示元素名称:(创建此表达式的较短方式不需要使用|会很高兴知道..所以如果您有建议,那将是真棒!)

//*[@color='red']/@* | //*[@color='red'] 

另一种选择(我希望是可能的)是选择元素名称的属性属于从模板而不改变XPath表达式(因为我可能要在另一个上下文中使用这个表达式没有元素名称)。

有这样的XSLT:

<xsl:param name="built_expression" select="//*[@color='red']/@* /> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <table> 
       <tr> 
        <th>Element Name</th> 
        <th>Element Content</th> 
       </tr> 

       <xsl:apply-templates select="$built_expression"/> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <tr> 
     <td> 
     <xsl:value-of select="ELEMENT name()" /> 
     </td> 
     <td> 
     <xsl:value-of select="node()" /> 
     </td> 
    </tr> 

    ... other display stuff to do with the attributes ... 
</xsl:template> 

这显然是行不通的......但我希望你明白我的意思..

<xsl:value-of select="name()"/> 

只是返回属性的名称,但我需要选择无我属性的元素。

谢谢!让我知道是否需要澄清任何事情!

回答

1

你只需要这个XPath:

name(..) 

这工作,如果上下文节点是您选择的属性节点。

2
<xsl:value-of select="name()"/> 

刚刚返回 属性的名称,但我需要选择属性的元素的 名称。

的元件到其中属性所属被认为是它的父,因此:

..

当与上下文节点作为一个属性发出的,选择元件到该属性所属的。

为了找到这个元素的名称,只需使用XPath name()功能:

name(..)

当与上下文节点是一个属性发出的计算结果为一个字符串,它是该元素的名称拥有该属性。