XPATH中的名称功能

时间:2012-08-06 09:43:32

标签: xslt xpath

我的xmi文件中有以下元素:

<element1 id= 3 >

<element2 id= 3>

我想将它们转换成类似的东西:

<element1 id= 3 name =element2>
<element2 id= 3>

我正在使用xslt进行转换:

<xsl:if test="@id = //*[@id]/@id">
                <xsl:sequence
                    select="fn:createAtt('name',X)" />
            </xsl:if>

我想比较两个元素的id,如果它们匹配,那么我想将第二个元素(element2)的名称保存到第一个元素的name属性中。

比较正常。问题是如何读取第二个元素的名称?我尝试使用name()函数,但无法准确读取与比较匹配的名称。

1 个答案:

答案 0 :(得分:0)

我会这样做:首先将键定义为

<xsl:key name="el-by-id" match="*" use="@id"/>

然后我会写一个模板

<xsl:template match="*[@id]">
  <xsl:variable name="same-id" use="key('el-by-id', @id) except ."/>
  <xsl:copy>
     <xsl:copy-of select="@*"/>
     <xsl:if test="$same-id">
       <xsl:attribute name="name" select="node-name($same-id[1])"/>
     </xsl:if>
     <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

通过这种方式,您可以使用键有效地引用元素,然后如果找到一个具有相同id的元素,则会创建名为name的属性。我使用了XSLT / XPath 2.0 node-name函数,具体取决于您可能希望使用<xsl:attribute name="name" select="name($same-id[1])"/>的确切要求。