Xslt 添加另一个值的属性';s元素';s属性';s值
我有xml:Xslt 添加另一个值的属性';s元素';s属性';s值,xslt,xpath,Xslt,Xpath,我有xml: <graph> <node id="a" /> <node id="b" /> <node id="c" /> <node id="d" /> <link from="a" id="link1" to="b"/> <link from="b" id="link2" to="d"/> <link from="d" id="link3" to="c"/> </graph>
<graph>
<node id="a" />
<node id="b" />
<node id="c" />
<node id="d" />
<link from="a" id="link1" to="b"/>
<link from="b" id="link2" to="d"/>
<link from="d" id="link3" to="c"/>
</graph>
我想通过xslt将其转换为下一个xml:
<graph>
<node id="a">
<link id="link1" to="b">
</node>
<node id="b">
<link id="link2" to="d">
</node><node id="c">
<node id="c"/>
<node id="d">
<link id="link3" to="c">
</node>
</graph>
我编写了xslt,其中包括下一部分:
<xsl:template match="//node">
<xsl:element name="link">
<xsl:attribute name="to">
<xsl:value-of select="//link[@from = self::node()/@id]/@to"></xsl:value-of>
</xsl:attribute>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
但这不起作用。我做错了什么?XSLT只创建
链接
元素,但您必须以某种方式创建图形
和节点
元素。此外,谓词中的self::node()也不能像您期望的那样工作。改用current()
函数
为了解决您的任务,最好从身份转换开始,并为需要特殊处理的节点添加模板。下面是一个例子:
<!-- Identity transform -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="graph">
<xsl:copy>
<!-- Only process node children -->
<xsl:apply-templates select="node"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node">
<xsl:copy>
<!-- Also process matching links -->
<xsl:apply-templates select="@* | //link[@from = current()/@id]"/>
</xsl:copy>
</xsl:template>
<!-- Don't copy @from attribute of links -->
<xsl:template match="link/@from"/>
XSLT只创建
链接
元素,但您必须以某种方式创建图形
和节点
元素。此外,谓词中的self::node()也不能像您期望的那样工作。改用current()
函数
为了解决您的任务,最好从身份转换开始,并为需要特殊处理的节点添加模板。下面是一个例子:
<!-- Identity transform -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="graph">
<xsl:copy>
<!-- Only process node children -->
<xsl:apply-templates select="node"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node">
<xsl:copy>
<!-- Also process matching links -->
<xsl:apply-templates select="@* | //link[@from = current()/@id]"/>
</xsl:copy>
</xsl:template>
<!-- Don't copy @from attribute of links -->
<xsl:template match="link/@from"/>