我的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()函数,但无法准确读取与比较匹配的名称。
答案 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])"/>
的确切要求。