<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<TreeNode bbd="" id="TreeNodID" vid="VirtualID" />
<ChildNode bbd="bbd1" date="2017-02-22T15:04:32Z" object="ChildNodeID" thread="TreeNodID" />
</Root>
我想写一个xslt,它会重写像
这样的xml<?xml version="1.0" encoding="UTF-8"?>
<Root>
<TreeNode bbd="bbd1" id="TreeNodeID" vid="VirtualID" object="ChildNodeID" />
<ChildNode bbd="bbd1" date="2017-02-22T15:04:32Z object="ChildNodeID" thread="TreeNodeID" />
</Root>
我想找到任何节点的/*/@thread
属性等于TreeNode/@id
的节点。获取匹配节点的@object
属性的值,并将其填充到TreeNode
元素中。同时获取bbd
值并将其填充到TreeNode
元素中。
我不知道匹配节点是ChildNode
还是其他。
我怎样才能做到这一点?
答案 0 :(得分:0)
您也可以使用
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:aa="http://www.tcxml.org/Schemas/TCXMLSchema">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*" >
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="aa:TreeNode">
<xsl:variable name="id" select="@id"/>
<xsl:copy>
<xsl:attribute name="bbd" select="//*[@thread eq $id]/@bbd"/>
<xsl:copy-of select="@*[normalize-space(.) ne '']"></xsl:copy-of>
<xsl:attribute name="object" select="//*[@thread eq $id]/@object"/>
<xsl:apply-templates select="node()"></xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
我可以使用以下xslt来完成此操作 `
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TreeNode">
<xsl:copy>
<xsl:if test="/*/node()/@thread=@id">
<xsl:attribute name="object">
<xsl:value-of select="/*/node()/@object"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
`
剩下的部分是 - 如果存在,则bbd然后检查值是否为空,然后添加属性并填充值,如果已经填充了某个值,则保持原样。 否则添加属性并填充值。