0

我的 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() 函数,但无法准确读取与比较匹配的名称。

4

1 回答 1

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.0node-name函数,具体取决于您可能想要使用的确切要求<xsl:attribute name="name" select="name($same-id[1])"/>

于 2012-08-06T10:20:48.677 回答